Как защитить от подмены скрипт на сайте

Один из наших заказчиков задал нам вопрос: "Как я могу быть уверен, что содержимое вашего JS-скрипта отслеживания, устанавливаемого к нам на сайт в какой-то момент не поменяется? Можете гарантировать нам, что он не начнёт отслеживать или передавать больше чем должен куда-то на сторону?"

Вопрос интересный. Мы сразу ответили, что скрипт отслеживания MauticJS (mtc.js) у нас стандартный - его содержимое открыто и легко поддаётся анализу. Полная раскладка по нему в документации. Но это как-то не воодушевило клиента и он ещё раз уточнил, что его волнует именно гарантия неизменности файла отслеживания в будущем.

Ради спокойствия клиента мы всё же задумались - ведь и правда, гипотетически, в файл mtc.js (впрочем как и в скрипт Yandex.Metrika https://mc.yandex.ru/metrika/tag.js или любой другой сторонний скрипт у вас на сайте) уже после установки можно что-то дописать так, чтобы никто и не заменит. Значит нужно сделать так, чтобы выполнялся только исходный оригинальный скрипт.

Есть задача - есть решение. Простое и элегантное ;)

  1. Генерируем хеш скрипта, например через https://beautifycode.net/sri-hash-generator
  2. Редактируем код вставки на сайт так, чтобы скрипт выполнялся только при условии совпадения хеша с оригинальным скриптом.

    <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-скрипт даже не запустится!

Огромное спасибо клиенту за правильный вопрос - мы теперь во всех скриптах внедрили проверку и другим советуем ;)

Previous Post