Политика данных «data» не работает для base64 изображений в Chrome 28

247

В этом простом примере я пытаюсь установить заголовок CSP с заголовком meta http-эквивалент. Я включил изображение base64, и я пытаюсь заставить Chrome загрузить изображение.

Я думал, что dataключевое слово должно сделать это, но почему-то это не работает.

Я просто получаю следующую ошибку в Developer Tools:

Отказался, чтобы загрузить данные ': изображение / PNG; base64, R0lGODlhDwAPAOZEAMkJCfAwMMYGBtZMTP75 + euIiPFBP + hVVf3v7 ... nw7yk4Mjr6GLUY + joiBI2QAACABwJDCHgoKOHEoAYVBAgY8GGAxAoNGAmiwMHBCgccKDAKBAA7' изображений, потому что он нарушает следующие директивы Content Security Policy: "IMG-Src 'самость' данные".

Пример кода (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

fwebdev
источник

Ответы:

468

Согласно грамматике в спецификации CSP , вам нужно указывать схемы как scheme:, а не только scheme. Итак, вам нужно изменить директиву источника изображения на:

img-src 'self' data:;
острая боль
источник
41
Причина этой неловкости в том, что в противном случае трудно различить схему «данных» и хост с именем «данные».
Майк Вест
1
Я думаю, что URL-адреса немного неудобно для анализа в целом.
5
У меня были мои данные: в кавычках - «данные:» - которые также не работают - и ваш ответ также предупредил меня об этом как о проблеме
kris
18
Полезно отметить, что вы не должны просто добавлять это без учета последствий для безопасности. Посмотрите этот вопрос об обмене стека безопасности
Matthijs Wessels,
1
Сканеры безопасности находят данные: как небезопасный элемент
Саджит
0

Попробуй это

данные для загрузки:

<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=
JamesH
источник
Я не думаю, что возможно включить тип после протокола. Действителен только «data:».
rameezk