2015-03-26 4 views
17

Есть ли какая-либо реализация или спецификация для включения хэша или подписи в атрибут тега <, чтобы браузер мог убедиться, что правильный файл был извлечен до его выполнения ? Что-то вроде:Задание хэша скрипта от ненадежного хоста

<script 
    src="http://cdn.example.com/jquery-2001.js" 
    signature="sha-256/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" 
></script> 

мотивация заключается в следующем: как правило, каждый дополнительный CDN или хост вы используете для вашего сайта повышает уязвимость, добавляя новую цель, которая может быть взломан, чтобы взломать ваш сайт. Предоставление вашим основным интерфейсным серверам утверждений хэшей или подписи этих файлов может полностью устранить этот риск, что позволит вам быть более гибкими при проектировании вашей архитектуры. Вы даже можете запросить отсутствующие файлы из ненадежной одноранговой сети.

Я думал, что вспомнил спецификацию об этом, но не смог его найти.

+0

[Нет атрибута 'подпись'.] (Https://html.spec.whatwg.org/multipage/scripting.html#the-script-element) Зачем вам это нужно? – undefined

+0

Я не ожидал, что это будет в общепринятых стандартах, но подумал, что есть предложение, которое было реализовано на какой-то платформе. «подпись» была примером того, что может быть именем - я ожидал бы, что настоящее имя и синтаксис будут более продуманными, чем мой пример. – Tim

+0

Что-то вроде этого необходимо, чтобы иметь возможность использовать общие CDN (например, предоставленные jQuery) или CDN в целом, не увеличивая риск вашей безопасности. Как правило, каждая добавленная дополнительная CDN-услуга означает еще одну услугу, которая может быть взломана, чтобы поставить под угрозу ваш сайт. Если ваш основной сайт может утверждать хеши/подписи файлов, на которые он ссылается, этот риск устраняется. Я уверен, что у нас будет стандарт. – Tim

ответ

18

Эта функция была предложена W3C как Subresource Integrity. По состоянию на декабрь 2015 года эта рекомендация была выполнена by Chrome 44 и Firefox 43.

Пример 1
<link rel="stylesheet" href="https://site53.example.net/style.css" 
     integrity="sha256-vjnUh7+rXHH2lg/5vDY8032ftNVCIEC21vL6szrVw9M=" 
     crossorigin="anonymous"> 

Существует a superficially similar feature in Content Security Policy Level 2, но он ограничивает только содержимое встроенного <script> и <style> элементов, а не внешние.

0

Это не выглядит, как она поддерживается в соответствии с Mozilla Network Developer документы:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script

Однако, вы всегда можете извлечь ресурс через XHR (предполагается, что CORS настроен), хэш, и если это круто, eval(). Однако, хотя интересное техническое упражнение это не кажется практичным.

1

FWIW, сегодня я создал MDN page for Subresource Integrity (функция описана в ответе здесь). Также связан: A CDN that can not XSS you: Using Subresource Integrity от Frederik Braun (соредактор спецификации Integrity Subresource), в котором более подробно описывается проблема, описанная в этом вопросе, а также объясняется, как функция целостности Subresource обращается к этой проблеме.