内容安全策略“数据”不适用于 Chrome 28 中的 base64 图像

Posted

技术标签:

【中文标题】内容安全策略“数据”不适用于 Chrome 28 中的 base64 图像【英文标题】:Content Security Policy "data" not working for base64 Images in Chrome 28 【发布时间】:2013-08-29 04:04:15 【问题描述】:

在这个简单的示例中,我尝试使用元 http-equiv 标头设置 CSP 标头。我包含了一个 base64 图像,我正在尝试让 Chrome 加载图像。

我认为 data 关键字应该这样做, 但不知何故它不起作用。

我只是在开发者工具中收到以下错误:

拒绝加载图像 'data:image/png;base64,R0lGODlhDwAPAOZEAMkJCfAwMMYGBtZMTP75+euIiPFBP+hVVf3v7...nw7yk4Mjr6GLUY+joiBI2QAACABwJDCHgoKOHEoAYVBAgY8GGAxAoNGAmiwMHBCgccKDAKBAA7' 指令,因为它违反了以下“自身内容安全策略数据”指令:“' >

示例代码(JSFiddle 不适用于此示例,因为我无法在那里设置元标头):

<html>
<head>
<meta http-equiv="Content-Security-Policy" content="
        default-src 'none';
        style-src 'self' 'unsafe-inline';
        img-src 'self' data;
        " />
    <style>
        #helloCSP 
            width: 50px;
            height: 50px;
            background: url(data:image/png;base64,R0lGODlhDwAPAOZEAMkJCfAwMMYGBtZMTP75+euIiPFBP+hVVf3v7+iHh/JNTfh9dNUYGPjTvskXFfOLi/daVe96es4eHPWIiOqbi9dNRvzWwexdV9U1NeFSS94iIvuxodVGP/ZsZM8jI+ibm/alluQzMdxSSvbGstwsKu2Yid4iIfjQu/JnYO6djvajlMQEBPvLuOJdXeMxL/3jzPBSTdwqKNY2Mf3i4vU5OfbPz/3f3/zUv/zizO0tLc0NDfMzM+UlJekpKeEhId0dHdUVFdkZGdEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEQALAAAAAAPAA8AAAepgESCRBsLEDQQCxuDgxYdO5CROx0WgywGAQEKM0M2CpkGN0QvMDmmE0OpE6Y5KEQqPbE9D6lDD7I9IBc8vDwRtRG9PBcuPsY+B7UHxz4hP8/PGghDCBrQPyYxQdvbBUMF3NskGUDl5QwtDOblGSVC7+8JNQnw7yk4Mjr6GLUY+joiBI2QAACABwJDCHgoKOHEoAYVBAgY8GGAxAoNGAmiwMHBCgccKDAKBAA7) no-repeat;
            border: 1px solid red;
        
    </style>
</head>
<body>
<h1>CSP</h1>
    <div id="helloCSP"></div>
</body>
</html>

您也可以在此处打开此示例:https://dl.dropboxusercontent.com/u/638360/ps/csp.html

【问题讨论】:

如果您仍在寻找解决方案,请看这里:***.com/a/62213224/7827321 【参考方案1】:

根据the grammar in the CSP spec,需要指定scheme为scheme:,而不仅仅是scheme。因此,您需要将图像源指令更改为:

img-src 'self' data:;

【讨论】:

这种尴尬的原因是很难区分“数据”方案和名为“数据”的主机。 我认为 URL 解析起来有点笨拙。 我有我的数据:引号 - '数据:' - 这也无法正常工作 - 你的回答也提醒我这是一个问题 请注意,您不应该在不考虑安全隐患的情况下添加它。见this security stack exchange question 我真的很想看到一个例子来展示使用img-src data: 具有安全隐患。【参考方案2】:

试试这个

要加载的数据:

<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'><path fill='#343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>

获取一个 utf8 到 base64 的转换器并将“svg”字符串转换为:

PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUn
PjxwYXRoIGZpbGw9JyMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=

CSP 是

img-src data: image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUn
PjxwYXRoIGZpbGw9JyMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=

【讨论】:

我认为不可能在协议之后包含类型。只有“数据:”是有效的。

以上是关于内容安全策略“数据”不适用于 Chrome 28 中的 base64 图像的主要内容,如果未能解决你的问题,请参考以下文章

内容安全政策指令不适用于电子

Chrome 远程调试不适用于 IP

如何在 Chrome 扩展 Manifest.json 中设置内容安全策略以使 Firebase 正常工作

CORS 适用于 chrome 但不适用于 firefox、angularjs

无头 Chrome 驱动程序不适用于 Selenium

Chrome 中的断点不适用于 Sourcemap