Microsoft Edge не принимает хэши для политики безопасности содержимого

Проблема

Content-Security-Policy по умолчанию должен заносить в черный список скрипт и стиль синтаксического анализа и разрешать его на основе различных инструкций, одна из которых проверяет хэш ожидаемого результата. Браузер не должен реализовывать какой-либо Javascript или CSS, которому заранее не был присвоен соответствующий хэш. Код с совпадающим хешем должен выполняться как обычно. Microsoft Edge отказывается от всех внутристраничных блоков JS / CSS.

  • Инструкции. Перейдите по приведенной ниже ссылке для демонстрации в Microsoft Edge, а также в любом другом браузере.

  • Живая демонстрация: http://output.jsbin.com/biqidoqebu

Демонстрация оригинального исходного кода

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='; script-src https://ajax.googleapis.com 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc=';" />
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; style-src 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='; script-src https://ajax.googleapis.com 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc=';" />
<style>#loading{color:transparent}#loading:after{color:green;content:"Style loaded."}</style>
</head>
<body>
<span id="loading">Hashes loading...</span>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>alert("Script loaded.")</script>
  • Ожидаемое поведение: тело должно измениться на «Стиль загружен.», в окне предупреждения должно быть указано «Сценарий загружен.», внешний Javascript не должен выдавать ошибку. Консоль не показывает проблем.
  • Фактическое поведение: тело зависает при "Загрузка хэшей ...". Хэши отклонены, внешний Javascript принят. Консоль показывает ошибки:

CSP14304: Unknown source ‘'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='’ for directive ‘style-src’ in - source will be ignored.

CSP14306: No sources given for directive ‘style-src’ for - this is equivalent to using ‘none’ and will prevent the downloading of all resources of this type.

CSP14304: Unknown source ‘'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc='’ for directive ‘script-src’ in - source will be ignored.

CSP14312: Resource violated directive ‘style-src 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='’ in : inline style. Resource will be blocked.

CSP14312: Resource violated directive ‘script-src LINK-REMOVED-INSUFFICIENT-REPUTATION-ON-STACKOVERFLOW-SHOULD-BE-THE-GOOGLE-API-URL 'sha256-iZzrsbzuGxfOaTdnB/E6RQBssyXQRp7W8YtZD2Wg/Rc='’ in : inline script. Resource will be blocked.

Попытки исправить

  • Проверка правильности хэшей: дважды проверенное вычисление было двоичным, вот и все. Делать особо нечего, их принимают другие браузеры.
  • Изменены значения default-src и connect-src на self, а не none

Я не могу придумать, что еще попробовать.

Обновление через 24 часа: добавлен X-Content-Security-Policy для полноты и обновлен URL-адрес JSBin, хотя это не имеет значения для данной конкретной ситуации.


person StackOverflowAcc    schedule 30.07.2015    source источник
comment
Internet Explorer поддерживает это?   -  person Daniel A. White    schedule 30.07.2015
comment
вы должны использовать настоящий http-заголовок.   -  person Daniel A. White    schedule 30.07.2015
comment
вы пробовали style-src self 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA=' или style-src URL_OF_YOUR_PAGE 'sha256-JtUhvM7uQO2KX5IEGWxN+rhEyzzsyFelfO2gXvYEuWA='?   -  person ben    schedule 30.07.2015
comment
@ Дэниел А. Уайт - проблема не возникает в IE11. Страница создается динамически, а затем кэшируется на стороне сервера, поэтому HTTP-заголовки невозможны. Хотя, по-видимому, вы захотите, чтобы заголовки были на странице, если они когда-либо загружались из кеша клиента. Это не должно иметь значения, браузеры явно с этим справляются.   -  person StackOverflowAcc    schedule 30.07.2015
comment
@ben Да, домен вместо себя не помогает. Я уверен, что это в любом случае следует применять только к отдельным запросам.   -  person StackOverflowAcc    schedule 30.07.2015
comment
@oreoshake IE11 действительно понимает CSP, включая хэши, как и Opera и, возможно, многое другое. Фактически, IE11 в Windows 10 больше не использует префикс X-. Я обновил URL-адрес JSBin, включив в него заголовок X-CSP, попробуйте сами. Вот почему это меня так озадачивает: похоже, поддержка нового браузера была удалена.   -  person StackOverflowAcc    schedule 31.07.2015
comment
p.s. Я удалил свою потенциальную дезинформацию, описанную ниже: только chrome поддерживает nonces / hashes AFAIK по состоянию на 31/7/2015 И это потому, что IE 11 не понимает политику безопасности контента. Подсказки по использованию хешей :)   -  person oreoshake    schedule 31.07.2015


Ответы (2)


РЕДАКТИРОВАТЬ: это может быть неверно. См. Комментарии выше.

IE 11 не поддерживает Content-Security-Policy (только X-Content-Security-Policy), это не открывается. IE 12 поддерживает CSP, но не обрабатывает одноразовые номера / хэши, он не закрывается ... если вы также не укажете 'unsafe-inline' в заголовке Content-Security-Policy.

Уровень 2 CSP говорит: «Если хэш или одноразовый номер предоставлен, игнорировать 'unsafe-inline'». это для обратной совместимости, так как старые браузеры будут искать 'unsafe-inline', но не одноразовые номера / хэши. См. http://www.w3.org/TR/CSP2/#directive-script-src

person oreoshake    schedule 31.07.2015
comment
Объяснение может быть не совсем в деньгах, но добавление «небезопасного встроенного» решения - это решение. Я не знал, что он изящно деградировал, по крайней мере, сайт снова работает. Я не думаю, что есть объяснение, я предполагаю непреднамеренное регрессирование функции. Я сообщил об этом как об ошибке, спасибо, что взвесили. - person StackOverflowAcc; 31.07.2015

http://caniuse.com/#feat=contentsecuritypolicy

http://caniuse.com/#feat=contentsecuritypolicy2

IE Edge не поддерживает уровень политики безопасности контента 2, а hash-source относится к уровню 2.

person Clauz    schedule 30.07.2015
comment
Это могло быть объяснением, но пример работает правильно в IE11, поэтому информация там слишком обширна или частично отсутствует. Я не знаю, как появился Edge, возможно ли, что он разветвился от IE11 до того, как были реализованы хэши CSP? - person StackOverflowAcc; 30.07.2015
comment
@StackOverflowAcc Из первой ссылки я прочитал, что IE поддерживает его с заголовком X-Content-Security-Policy, вы можете попробовать. - person Clauz; 30.07.2015
comment
Это только IE10-11. Хороший момент, я уже использовал оба и забыл включить их в свою заявку! ‹Code› X-Content-Security-Policy ‹/code› Не имеет никакого значения для Edge и также не кажется необходимым для IE11 в Windows 10. - person StackOverflowAcc; 30.07.2015