2015-12-19 12 views
2

Я хотел бы реализовать Subresource Integrity и кэширование для статических активов, таких как таблицы стилей и файлы JavaScript в моем приложении. В настоящее время я использую PHP с шаблонами Twig.Недостатки целостности и методы кэширования ошибок в PHP

Я знаю, что существует множество инструментов для генерации хэшей для всех файлов JS и CSS, но я ищу, как реализовать хэши в тегах и <link> для сотен файлов.

This blog post описал большую часть того, что я пытаюсь сделать, однако автор использует только кэширование и использует статическую метку времени в имени файла, которую он меняет вручную каждый раз. Использование инструмента построения для программной генерации этой временной метки не является трудным, но с SRI это значение является хешем, который равен различным для каждого файла.

Например, фрагмент header.html.twig:

<!-- cdn requests --> 

<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js' 
    integrity='sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx' 
    crossorigin='anonymous'></script> 

<!-- same-origin requests --> 

<script src='foo.1a516fba.min.js' 
    integrity='sha384-GlFvui4Sp4wfY6+P13kcTmnzUjsV78g61ejffDbQ1QMyqL3lVzFZhGqawasU4Vg+'></script> 
<script src='bar.faf315f3.min.js' 
    integrity='sha384-+vMV8w6Qc43sECfhc+5+vUA7Sg4NtwVr1J8+LNNROMdHS5tXrqGWSSebmORC6O86'></script> 

Изменение атрибутов src/href и integrity каждый раз, когда это не разумный подход.

Я мог бы написать функцию Twig, которая вызывает функцию PHP для хэширования файла каждый раз, и он может работать на OK на dev, но это кажется ужасно дорогостоящим.

Что такое приемлемый подход к этому вопросу?

ответ

0

Чтобы ответить на ваш вопрос: нет приемлемого подхода, поскольку это не является надлежащим применением целостности Subresource.

Согласно W3C атрибут целостности:

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

Он был введен, потому что они дней много страниц извлекают свои скрипты CSS и JS из CDN, как и вы, и если хакер когда-либо получал контроль над CDN, они могли бы нанести чрезвычайный ущерб на тысячах сайтов, введя вредоносный код в доставленные ресурсы!

Представьте, что всякая версия jQuery, поставленная code.jquery.com или ajax.googleapis.com, неожиданно содержит вредоносный код! Сколько сайтов будет затронуто? Страшно.

Предоставляя агенту (браузеру) хэш целостности, с которым следует сравнивать содержимое загружаемого ресурса, вы гарантируете, что агент продолжает выполнять код только в том случае, если он получает именно то, что вы ему сказали. Если все по-другому, не верьте!

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

Но ...

Просто для спорта решения, что довольно забавная проблема, которую я хотел бы предложить, если вы хотите, чтобы динамически генерировать хэш для integrity атрибута:

Использование Глоток (мое личное предпочтение) для конкатенации, преуменьшать и отпечатком имя файла вашего ресурса. Прочтите содержимое сгенерированного файла, используя gulp.src('bar.*.min.js'). Используйте пакет NPM sha1, чтобы создать хеш в качестве переменной и, наконец, можно использовать gulp-inject, чтобы изменить атрибут src, а затем gulp-replace, чтобы написать атрибут integrity. Некоторые потоки, как это то, что я хотел бы пойти :-)

Я надеюсь, что ответит на ваш вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^