简单 XML 文件在不存在的图像上触发 CSP 错误?
Simple XML file triggering CSP error over a non-existent image?
我有一个具有以下 helmet-csp(处理内容安全策略以防止 XSS 和框架注入等漏洞的中间件)配置的 Express 服务器:
server.use(csp({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", '*.google-analytics.com'],
imgSrc: ["'self'", '*.google-analytics.com'],
connectSrc: ["'none'"],
styleSrc: ["'self'", "'unsafe-inline'", 'maxcdn.bootstrapcdn.com'], // Remove unsafe-inline for better security
fontSrc: ["'self'"],
objectSrc: ["'self'"],
mediaSrc: ["'self'"],
frameSrc: ["'self'"]
}
}));
我的根目录中还有一个 browserconfig.xml 文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="/mstile-70x70.png"/>
<square150x150logo src="/mstile-150x150.png"/>
<square310x310logo src="/mstile-310x310.png"/>
<wide310x150logo src="/mstile-310x150.png"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>
如您所见,这是一个简单的 XML 文件,没有图像数据,更不用说 SVG 了。然而,当我尝试点击 https://www.schandillia.com/browserconfig.xml 时,控制台中会抛出以下内容:
Refused to load the image 'data:image/svg+xml,http://www.w3.org/2000/svg' fill='%23909090' width='10'
height='10'>' because it violates
the following Content Security Policy directive: "img-src 'self'
*.google-analytics.com".
请注意,XML 文件的内容也显示在浏览器屏幕中。只是控制台错误让我感到困惑。我的服务器抱怨的图像文件在哪里?
P.S.: 有什么方法可以 allow 只是这个特定的 SVG(不管它是什么,假设它是安全的并且不是恶意的,来自像 www.w3.org) 这样合法的来源在我的 imgSrc
指令中?我尝试修改我的 server.csp()
但没有成功:
server.use(csp({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", '*.google-analytics.com'],
imgSrc: ["'self'", 'data:', '*.google-analytics.com'],
connectSrc: ["'none'"],
styleSrc: ["'self'", "'unsafe-inline'", 'maxcdn.bootstrapcdn.com'], // Remove unsafe-inline for better security
fontSrc: ["'self'"],
objectSrc: ["'self'"],
mediaSrc: ["'self'"],
frameSrc: ["'self'"]
}
}));
这个神秘物体是什么,如何让它不再干扰浏览器?
这似乎是 Chrome 中的错误。您在 Chrome 中导航到(打开)的任何 XML 文件都会发生这种情况,该文件没有关联的样式表。在这种情况下,Chrome(出于其自身的内部目的)从 data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='%23909090' width='10' height='10'><path d='M0 0 L8 0 L4 7 Z'/></svg>
加载一个披露三角形图像 — 或尝试这样做。
如果您没有适当的 CSP 策略,Chrome 可以正常加载 data:
URL 图像,不会出现错误。但是,如果您 有 CSP 策略并且它不允许 data:
来源,那么浏览器将阻止加载它。
有一种方法可以让您的 CSP 允许该图像,但这种方法并不比在您的策略中指定 'unsafe-inline'
更安全。方法是将 data:
作为 img-src
指令的来源。但这会产生允许来自任何 data:
URL.
图像的效果
另请注意:问题中引用的特定 data:
URL 并非来自 www.w3.org。任何地方的任何 SVG 图像都会有 xmlns='http://www.w3.org/2000/svg'
部分。那只是 SVG 命名空间标识符。因此,这并不表示它是由 www.w3.org 提供的,也不表示它一定是安全的。
我有一个具有以下 helmet-csp(处理内容安全策略以防止 XSS 和框架注入等漏洞的中间件)配置的 Express 服务器:
server.use(csp({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", '*.google-analytics.com'],
imgSrc: ["'self'", '*.google-analytics.com'],
connectSrc: ["'none'"],
styleSrc: ["'self'", "'unsafe-inline'", 'maxcdn.bootstrapcdn.com'], // Remove unsafe-inline for better security
fontSrc: ["'self'"],
objectSrc: ["'self'"],
mediaSrc: ["'self'"],
frameSrc: ["'self'"]
}
}));
我的根目录中还有一个 browserconfig.xml 文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="/mstile-70x70.png"/>
<square150x150logo src="/mstile-150x150.png"/>
<square310x310logo src="/mstile-310x310.png"/>
<wide310x150logo src="/mstile-310x150.png"/>
<TileColor>#da532c</TileColor>
</tile>
</msapplication>
</browserconfig>
如您所见,这是一个简单的 XML 文件,没有图像数据,更不用说 SVG 了。然而,当我尝试点击 https://www.schandillia.com/browserconfig.xml 时,控制台中会抛出以下内容:
Refused to load the image 'data:image/svg+xml,http://www.w3.org/2000/svg' fill='%23909090' width='10' height='10'>' because it violates the following Content Security Policy directive: "img-src 'self' *.google-analytics.com".
请注意,XML 文件的内容也显示在浏览器屏幕中。只是控制台错误让我感到困惑。我的服务器抱怨的图像文件在哪里?
P.S.: 有什么方法可以 allow 只是这个特定的 SVG(不管它是什么,假设它是安全的并且不是恶意的,来自像 www.w3.org) 这样合法的来源在我的 imgSrc
指令中?我尝试修改我的 server.csp()
但没有成功:
server.use(csp({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", '*.google-analytics.com'],
imgSrc: ["'self'", 'data:', '*.google-analytics.com'],
connectSrc: ["'none'"],
styleSrc: ["'self'", "'unsafe-inline'", 'maxcdn.bootstrapcdn.com'], // Remove unsafe-inline for better security
fontSrc: ["'self'"],
objectSrc: ["'self'"],
mediaSrc: ["'self'"],
frameSrc: ["'self'"]
}
}));
这个神秘物体是什么,如何让它不再干扰浏览器?
这似乎是 Chrome 中的错误。您在 Chrome 中导航到(打开)的任何 XML 文件都会发生这种情况,该文件没有关联的样式表。在这种情况下,Chrome(出于其自身的内部目的)从 data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='%23909090' width='10' height='10'><path d='M0 0 L8 0 L4 7 Z'/></svg>
加载一个披露三角形图像 — 或尝试这样做。
如果您没有适当的 CSP 策略,Chrome 可以正常加载 data:
URL 图像,不会出现错误。但是,如果您 有 CSP 策略并且它不允许 data:
来源,那么浏览器将阻止加载它。
有一种方法可以让您的 CSP 允许该图像,但这种方法并不比在您的策略中指定 'unsafe-inline'
更安全。方法是将 data:
作为 img-src
指令的来源。但这会产生允许来自任何 data:
URL.
另请注意:问题中引用的特定 data:
URL 并非来自 www.w3.org。任何地方的任何 SVG 图像都会有 xmlns='http://www.w3.org/2000/svg'
部分。那只是 SVG 命名空间标识符。因此,这并不表示它是由 www.w3.org 提供的,也不表示它一定是安全的。