目前,我正致力于将内容安全策略(CSP)标头添加到现有应用程序中。如果默认情况下所有内容都被列入黑名单(default-src: 'none'
),然后将所有必需资源列入白名单(f.e。:img-src: 'self'
),那将是首选。
现在,当一张SVG图标中包含图标时,没有标签允许在Firefox(57& 58)中列入白名单,而img-src
指令适用于Chrome(63)和Opera(49) 。因此,这会迫使我削弱默认标签,我不愿意这样做。这是Firefox特有的错误,还是我们的代码违反了导致这种未定义行为的某些标准?
以下是重现行为的代码。
HTML,只导致Firefox阻止图像:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Security-Policy" content="
default-src 'none';
child-src 'self';
connect-src 'self';
font-src 'self';
frame-src 'self';
img-src 'self';
manifest-src 'self';
media-src 'self';
object-src 'self';
script-src 'self';
style-src 'self';
worker-src 'self';
">
</head>
<body>
<svg>
<use xlink:href="img.svg#circle"></use>
</svg>
</body>
</html>
虽然这在Firefox中有效,但CSP策略明显减弱:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Security-Policy" content="
default-src 'self';
">
</head>
<body>
<svg>
<use xlink:href="img.svg#circle"></use>
</svg>
</body>
</html>
img.svg
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none;">
<symbol id="circle" viewBox="0 0 64 64">
<g>
<circle cx="32" cy="32" r="32" />
</g>
</symbol>
</svg>