Jenkins中预览HTML文件无法显示图片问题解决办法
浏览器错误信息
log.html:1 Refused to load the image 'http://xxx:9000/default/xxxxx' because it violates the following Content Security Policy directive: "img-src 'self' data:".
HTML中图片不显示代码
< img src="http://xxx:9000/default/xxxxx" />
如果该src的值可以显示图片
< img src="data:image/png;base64,iVBORw...." />
虽然可以解决图片显示问题,但是会导致HTML文件过大
一劳永逸的解决方法
修改Jenkins的安全策略Jenkins : Configuring Content Security Policy
Jenkins启动时加入参数hudson.model.DirectoryBrowserSupport.CSP
java -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox allow-scripts; default-src 'none'; img-src * ; style-src 'self' 'unsafe-inline' data: ; script-src 'self' 'unsafe-inline' 'unsafe-eval' ;" -jar jenkins.war
Jenkins:配置内容安全策略
Jenkins 1.641 / Jenkins 1.625.3 将
Content-Security-Policy
标头引入 Jenkins 提供的静态文件(特别是DirectoryBrowserSupport
)。此标头设置为一组非常严格的默认权限,以保护 Jenkins 用户免受工作区、/userContent
或存档工件中的恶意 HTML/JS 文件的侵害。
不幸的是,一些流行且实用的插件受到了影响,除非放宽默认规则,否则将失去部分功能。
从 Jenkins 2.200 开始,可以在 Jenkins 系统配置中定义资源根 URL ,作为放宽内容安全策略规则的替代方法。有关详细信息,请参阅其内联帮助。
默认规则集
默认规则设置为:
sandbox; default-src 'none'; img-src 'self'; style-src 'self';
此规则集产生以下结果:
- 完全不允许 JavaScript
- 不允许插件(对象/嵌入)
- 不允许内联 CSS,或来自其他网站的 CSS
- 不允许使用其他网站的图片
- 不允许使用框架
- 不允许使用网络字体
- 不允许 XHR/AJAX
- ETC。
详细地:
-
sandbox
限制页面可以执行的多项操作,类似于sandbox
iframe 上设置的属性。有关禁止操作的完整列表。此属性未得到广泛支持。 -
default-src 'none'
禁止从任何地方加载脚本、AJAX/XHR/WebSockets/EventSources 的 URL、字体、插件对象、媒体和框架(图像和样式也被禁止,但下面描述的更具体的规则允许)。 -
img-src 'self'
允许从 Jenkins 提供的其他文件加载图像。禁止内联图像定义。 -
style-src 'self'
允许从 Jenkins 提供的其他文件加载样式表。禁止内联样式表。
执行
可以通过设置系统属性来修改 Jenkins 发送的 CSP 标头
hudson.model.DirectoryBrowserSupport.CSP
:
如果其值为空字符串,则
java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar jenkins.war
根本不会发送标题。
这可能非常不安全,应仅在检查整体安全设置后才使用。
任何其他值都将用作标头值,例如
java -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox; default-src 'self';" -jar jenkins.war
。
对系统属性的更改将立即生效,因此可以通过
Jenkins 脚本控制台
临时设置此系统属性,从而允许您尝试不同的值:
为标题设置自定义值:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; default-src 'self';")
取消设置标题:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
将标题设置为默认值:
System.clearProperty("hudson.model.DirectoryBrowserSupport.CSP")
找出当前标题值:
System.getProperty("hudson.model.DirectoryBrowserSupport.CSP")
最后使用
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox allow-scripts; default-src 'none'; img-src * data:; style-src 'self' 'unsafe-inline' data: ; script-src 'self' 'unsafe-inline' 'unsafe-eval' ;")