Целостность субресурсов и методы очистки кэша в PHP

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

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

В этой записи блога описана большая часть того, что я пытаюсь сделать, однако автор описывает только разрушение кэша и использует статическую временную метку в имени файла, которую он каждый раз меняет вручную. Использование инструмента сборки для программной генерации этой временной метки также не сложно, но с помощью 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 для хеширования файла каждый раз, и она может работать на ОК на dev, но это кажется ужасно дорогим в вычислительном отношении.

Каков подход к этому?

1 ответ

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

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

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

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

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

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

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

Но...

Если бы вы хотели динамически генерировать хеш для integrity атрибут:

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

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

Другие вопросы по тегам