Как защитить сайт от хулиганских скриптов

Приключение на 5 минут.

Как защитить сайт от хулиганских скриптов

У нас есть несколько проектов, в которых мы хулиганим на чужих сайтах: 

Добавляем звуки меча

Добавляем снежинки

Подсвечиваем манипуляции и пропаганду

Все они основаны на одной идее: некий рабочий код встраивается в сайт через консоль и что-то делает в браузере клиента. 

Наши проекты делают безобидные вещи. Но таким же образом можно создавать и довольно злые мошеннические программы, которые могут, например, воровать личные данные пользователя. Одно время это было популярно в социальных сетях: тебе предлагали какой-то код, который (как говорили) покажет, кто был на твоей страничке. А сам этот код воровал твой логин и пароль или отправлял спам по друзьям. 

В этой статье покажем, как защитить свой сайт от этого баловства. 

Основа — технология CSP

Недавно мы уже писали об этой технологии. Кратко суть: 

  • Вашему браузеру можно сказать, чтобы на каком-то сайте он не исполнял скрипты или не загружал картинки с посторонних ресурсов.
  • Это называется CSP — Content Security Policy.
  • Включенная CSP может сломать некоторые части сайта — например, внешние плагины комментариев или системы аналитики.
  • Но также она может и защитить ваш сайт от мошенников.
  • Чтобы включить защиту, нужно прописать в шапке каждого документа на сайте специальный запрет. 

Включаем CSP на сайте

Включить CSP можно на отдельном документе или на всём сайте сразу. Чтобы не ходить по каждой странице сайта и не вписывать вручную инструкции, можно задействовать механизмы .htaccess.

👉 .htaccess — это системный файл, с помощью которого можно управлять поведением веб-сервера (то есть программой, которая отгружает пользователю страницы вашего сайта). Если прописать что-то в этот системный файл, эти изменения отразятся на поведении всего сервера — например, можно запретить доступ к какой-то папке, задать единую кодировку для всех страниц сайта или, как в нашем случае, прописать CSP.

Чтобы защитить сайт от таких вставок, нужно добавить в файл .htaccess на сервере такие строки:

<ifModule mod_headers.c> 

    Header set Content-Security-Policy «script-src ‘self'» 

</ifModule>

Здесь мы говорим серверу:

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

Если хотите защиту посильнее, замените script-src на default-src, но тогда все скрипты, стили, картинки и фреймы тоже должны лежать на этом же сервере.

Сам файл .htaccess лежит в корне публичной части сервера. Если его у вас нет — создайте его вручную, работать будет точно так же. В нашем случае он есть, потому что мы уже с ним работали в прошлых проектах:

Как защитить сайт от хулиганских скриптов

👉 Файл должен называться именно так: .htaccess, с точкой в начале и без расширения (или, по-другому, без имени и с расширением htaccess). В некоторых системах такой файл создать проблематично, поэтому можно сделать так:

  1. На компьютере создать файл csp.htaccess
  2. Прописать в него всё, что нужно
  3. Загрузить на хостинг
  4. Переименовать в .htaccess уже на хостинге

Проверка

Изначально мы не настраивали никакие политики безопасности на сервере, поэтому из консоли мы можем добавить на сайт любой код. Для примера возьмём старый проект со снежинками:

  1. Копируем код инжекта из статьи.
  2. Открываем сайт mihailmaximov.ru.
  3. Открываем консоль, вставляем и запускаем код.
  4. Видим, что защиты нет и у нас появились снежинки.

Код для инжекта:

var js = document.createElement('script'); js.src = "https://thecode.media/wp-content/uploads/2019/12/snowfall2020.js"; document.body.appendChild(js);
Как защитить сайт от хулиганских скриптов
Пошли снежинки, значит, сервер позволяет загружать чужой код себе на страницу

Открываем .htaccess, вставляем код с политикой безопасности и перезагружаем страницу. Снежинок нет, браузер ругается на чужой скрипт — теперь он выполнять его не будет:

Как защитить сайт от хулиганских скриптов

❗️Наличие CSP не означает, что у нас появилась идеальная защита сайта — есть и другие способы внедрить вредоносный код в тело страницы. Но даже то, что мы сделали, уже сильно усложнит задачу злоумышленников.

Текст и скриншоты:

Михаил Полянин

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Олег Вешкурцев

Через год — лучше работа, выше зарплата
В «Яндекс Практикуме» становятся разработчиками с нуля. Выберите язык — веб, Python, Java, C++ — и учитесь. Джуны зарабатывают от 80 000 ₽, мидлы — от 150 000 ₽. Дальше — программы трудоустройства и компенсация, если пойдёте в Яндекс.
Через год — лучше работа, выше зарплата Через год — лучше работа, выше зарплата Через год — лучше работа, выше зарплата Через год — лучше работа, выше зарплата
Вам может быть интересно
Как сделать свой сайт за 10 минут без программирования
Как сделать свой сайт за 10 минут без программирования

Для некоторых это становится источником постоянного дохода, если подойти к процессу с умом.

easy
Красивые ссылки… с анимацией!
Красивые ссылки… с анимацией!

Невероятные… Фантастические… Ни капельки не бесящие.

easy
Пишем собственный лапшесниматель
Пишем собственный лапшесниматель

Инструмент для защиты ума от пропаганды, контрпропаганды, инфобизнеса и лжепсихологов.

easy
Простейший генератор креативного текста
Простейший генератор креативного текста

Без нейросетей, регистрации и СМС.

hard
Что такое Bootstrap и как его подключить
Что такое Bootstrap и как его подключить

С котиками!

medium
Как работает быстрая сортировка
Как работает быстрая сортировка

Ей уже 60 лет, но она до сих пор работает быстро

medium
Решаем задачу Эйнштейна перебором (и программированием)
Решаем задачу Эйнштейна перебором (и программированием)

Проверим 24 миллиарда комбинаций, почти не задействуя мозг

easy
Как работает язык SQL
Как работает язык SQL

Управляем базой данных из командной строки

medium
Метод append() в Python
Метод append() в Python

Добавляем в списки всё что нужно

easy
easy