CyberX

Unwired mind project homepage

Немного об атрибутах integrity и identity для загружаемых в браузер ресурсах

В связи с появлением в браузерных функциях решений криптографии на базе Subtle Crypt становится актуальным проверять целостность и оригинальность загружаемых при ходе парсинга HTML файлов таких как JavaScript файлы, CSS файлы, шрифты и картинки. Делается это путем хэширования всего содержимого файла получаемого по HTTP или HTTPS с последующим указанием атрибута хэша, который будет сверять наличие в файле изменений и блокировать обработку этих файлов при наличии коррумпированности содержимого.

Решения для проверки контрольной суммы содержимого загружаемого в браузер

Существует их 2 и они очень похожи.

  • Integrity проверка на базе CORS;
  • Indentity проверка без взаимодействия с CORS.

Проверять CORS на данный момент является дурным тоном. Он еле включается в браузере и должен быть выставлен в положение включено сервером. Я, например, не смог активировать Cross Origin путем установки заголовка сервером Apache и решил использовать identity, которая работает так же, но гораздо лучше.

Проверка хэширования файлов на базе Identity

Вот пример объявления проверки на наличие сбоев в контенте файла, которые могут быть обусловлены подменой содержимого или какой-то коллизией сети.


<script data-module="revolver core" src="/app/revolver.js" identity="sha512-46045bb024235cb263a67020252cf384491c34be4d7b202f3832cdd641017f2a2ea4a3b820057af0bae3e3553fdb13ddbd9bdf3b0089d7d2fc9e71ee1e50943c" crossorigin="anonymous"></script>

Обратите внимание на атрибут identity. Он может содержать два формата checksum файла. Обычно это либо hash файла в формате строки SHA, либо это тот же SHA, но с дополнительной оберткой в base64.

Вы вычисляете контрольную строку JavaScript файла с помощью библиотеки Open SSL или существует онолайн генератор: SRI generator; объявляете атрибуты identity или crossorigin. После этого браузер парсит теги и сверяет контрольные суммы. Если кто-то или что-то повредили файлы, подменили содержимое или возникла коллизия сети ‐ браузер блокирует выполнение этих файлов или отрисовку изображений, а также обработку CSS или шрифта.

Автоматическая генерация SHA Hash для локальных файлов сервера на PHP

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

Вот решение на PHP 7 для автоматической генерации тегов script с автоматической установкой атрибутов identity и контрольных сумм.


define('scripts', [
	[
		'part' => 'core', 
		'path' => '/app/revolver.js',
		'name' => 'revolver core'
	],

	[
		'part' => 'module', 
		'path' => '/app/revolver-cmf-module-1.js',
		'name' => 'revolver-executable-1'
	],

]);

// Generate identity hashes for core JS

$scripts = [];
foreach (scripts as $s) {

	$scriptTag = '<script data-module="'. $s['name'] .'" src="'. $s['path'] .'" identity="sha512-'. hash('sha512', file_get_contents(site_host . $s['path'])) .'" crossorigin="anonymous"';

	switch ($s['part']) {

		case 'core':
				
			$scriptTag .= '></script>';

			break;
		
		case 'module':
			
			$scriptTag .= ' defer="defer">';

			break;
	}
	
	
	$scripts[] = $scriptTag;
}

Описываем данные JavaScript файлов и указываем параметры. Параметр part установленный в значение module просто помогает системе добавить атрибут defer="defer", который позволяет не писать проверку на Contents Loaded или подобную в браузере, не писать проверку на инициализацию и просто запускает все defer скрипты в последний момент после обработки HTML браузером.

Здесь я использую самый злобный из доступных алгоритм SHA-512.

Далее, скрипты можно вывести в шаблон.

<?php foreach ($scripts as $s) print $s; ?>

Аналогично вы можете использовать автоматические контрольные суммы для картинок, шрифтов и CSS файлов.

Integrity и Identity возможно не нужны для соединеий по SSL

Скорее всего эти целостности(identity & integrity) хороши для протокола HTTP, но не имеют смысла для порта 443 и протокола HTTPS, который и так шифрует содержимое передаваемое в сети, однако, чем черт не шутит.

Данное решение также уже интегрировано в следующий release RevolveR CMF.

Comments …

You can write here as guest with moderation. Please confirm your person if you have an account or register.

Add a comment as :
Captcha:
Pattern:
Repeat: