Защита целостности подресурса не работает в Chrome
Я добавил integrity
а также crossorigin
теги к моим сценариям в соответствии с целостностью субресурсов, но теперь они выдают ошибку в консоли, говоря
Сценарий из источника " http://pagead2.googlesyndication.com/" заблокирован для загрузки политикой общего доступа к ресурсам разных источников: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Источник ' http://localhost:81/', следовательно, не имеет доступа.
Вот сценарий:
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"
integrity="sha256-5xwrIw3xU3VvipjVMZNyf6+27C/a1Pxl3U0jl3hTcao="
crossorigin="anonymous"></script> <!-- Banner --> <ins class="adsbygoogle" style="display:inline-block;width:728px;height:90px" data-ad-client="ca-pub-3346556035533863" data-ad-slot="8052306231"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script>
Вот вывод:
$ curl -s http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js | openssl dgst -sha256 -binary | openssl base64 -A
5xwrIw3xU3VvipjVMZNyf6+27C/a1Pxl3U0jl3hTcao=
Я также добавил атрибуты в скрипт Amazon, и это тоже не помогло.
Сценарий из источника " http://s3.amazonaws.com/" заблокирован для загрузки политикой общего доступа к ресурсам разных источников: в запрошенном ресурсе отсутствует заголовок "Access-Control-Allow-Origin". Источник ' http://localhost:81/', следовательно, не имеет доступа.
<script async="async" type="text/javascript" src="//s3.amazonaws.com/cc.silktide.com/cookieconsent.latest.min.js"
integrity="sha256-/8egBZx4+UIzXH8il2CNdL5+npDYgoAsjC76KHO/re4=" crossorigin="anonymous"></script>
Chrome поддерживает SRI: http://enable-cors.org/client.html, https://www.chromestatus.com/feature/6183089948590080
Я проверил, правильно ли генерируется хеш, используя пример в спецификациях: http://www.w3.org/TR/SRI/
Так почему это не работает? Работает без двух новых атрибутов.
Ссылка: https://www.srihash.org/
Версия Chrome 46.0.2490.86 м
1 ответ
Я думаю, что это потому, что сервер специально не разрешал CORS, поэтому Chrome заблокировал его. Скрипт Silktide cookie перенесен в Cloudflare, который явно имеет Access-Control-Allow-Origin
, так что теперь это работает. Я не знаю, почему браузер будет заботиться о том, разрешает ли сервер скрипты разных источников или нет. Кажется, что пока хэши совпадают, не имеет значения, откуда они берутся.
<script async="async" type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/1.0.9/cookieconsent.min.js"
integrity="sha256-GQ/ALY6PHdWsxA9I0NYgPmEV6zHj9H9V2ww/B3l9aPA=" crossorigin="anonymous"></script>
Заголовки сервера:
$ curl -I http://cdnjs.cloudflare.com/ajax/libs/cookieconsent2/1.0.9/cookieconsent.min.js
HTTP/1.1 200 OK
Date: Tue, 24 Nov 2015 19:37:10 GMT
Content-Type: application/javascript
Connection: keep-alive
Last-Modified: Mon, 19 Oct 2015 15:05:30 GMT
Expires: Sun, 13 Nov 2016 19:37:10 GMT
Cache-Control: public, max-age=30672000
Access-Control-Allow-Origin: *
CF-Cache-Status: HIT
Server: cloudflare-nginx
CF-RAY: 24a791216c9b03f4-EWR