
Как защитить от подмены скрипт на сайте
Один из наших заказчиков задал нам вопрос: "Как я могу быть уверен, что содержимое вашего JS-скрипта отслеживания, устанавливаемого к нам на сайт в какой-то момент не поменяется? Можете гарантировать нам, что он не начнёт отслеживать или передавать больше чем должен куда-то на сторону?"
Вопрос интересный. Мы сразу ответили, что скрипт отслеживания MauticJS (mtc.js) у нас стандартный - его содержимое открыто и легко поддаётся анализу. Полная раскладка по нему в документации. Но это как-то не воодушевило клиента и он ещё раз уточнил, что его волнует именно гарантия неизменности файла отслеживания в будущем.
Ради спокойствия клиента мы всё же задумались - ведь и правда, гипотетически, в файл mtc.js (впрочем как и в скрипт Yandex.Metrika https://mc.yandex.ru/metrika/tag.js или любой другой сторонний скрипт у вас на сайте) уже после установки можно что-то дописать так, чтобы никто и не заменит. Значит нужно сделать так, чтобы выполнялся только исходный оригинальный скрипт.
Есть задача - есть решение. Простое и элегантное ;)
- Генерируем хеш скрипта, например через https://beautifycode.net/sri-hash-generator
-
Редактируем код вставки на сайт так, чтобы скрипт выполнялся только при условии совпадения хеша с оригинальным скриптом.
\\<script> (function(w,d,t,u,n,a,m){ w['MauticTrackingObject']=n; w[n]=w[n]||function(){(w[n].q=w[n].q||[]).push(arguments)}; a=d.createElement(t); m=d.getElementsByTagName(t)[0]; a.async=1; a.src=u; a.integrity="sha384-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; a.crossOrigin="anonymous"; m.parentNode.insertBefore(a,m); })(window,document,'script','https://m.yourserver.com/mtc.js','mt'); mt('send', 'pageview'); </script>
Где xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx заменяем на вычисленный хеш.
В итоге, в случае изменения содержимого уделённого файла - поменяется и его хеш. Хеши не совпадут и "левый" JS-скрипт даже не запустится!
Огромное спасибо клиенту за правильный вопрос - мы теперь во всех скриптах внедрили проверку и другим советуем ;)