Как защитить сайт от хакерских скриптов
medium

Как защитить сайт от хакерских скриптов

Включите политику безопасности.

Недавно мы делали проект лапшеснимателя — он подсвечивал потенциальные манипуляции в тексте. Чтобы это был хотя бы минимально полезный продукт, мы должны были запускать скрипт лапшеснимателя на чужих страницах. И на одних сайтах всё запускалось без проблем, а на некоторых других скрипт не заводился. 

Для нас как авторов скрипта это плохо. А для нас как веб-мастеров это интересно: можно ли защитить наши собственные сайты от взломов через скрипты?

👉 В этой статье мы разберём только один способ защиты. В жизни всё работает несколько сложнее и векторов атаки гораздо больше. Мы намеренно несколько упрощаем подачу.

Зачем нужна защита от вставки скриптов

Допустим, у нас есть сайт, который обрабатывает персональные данные пользователей: Ф. И. О. и номера телефонов. Часть этих данных получается и обрабатывается в JS-скрипте. Если немного изменить этот скрипт, можно обработать не только свои данные, но и получить данные всех пользователей сайта.

Чтобы изменить скрипт на странице или добавить в него новые команды, используют разные способы, например:

  • вставлять специальные команды в консоли, как это делали мы;
  • передавать вредоносный код внутри параметров адреса сайта;
  • отправить специальную JSON-строку, при парсинге которой может выполниться нужный нам код.

Каждый из этих способов может добавить на страницу свой код и выполнить её как бы от имени страницы сайта. Опасность тут в том, что обычно сайт доверяет тому, что делают его собственные страницы. Если от неё придёт запрос «Отдай мне список всех фамилий и телефонов» и сервер сможет это сделать — он это сделает, и список уйдёт в чужие руки.

Решение: политика безопасности контента

Чтобы защитить сайт и страницы от таких атак, придумали CSP — политику безопасности контента. Работает это так: 

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

CSP может запрещать загрузку чужих:

  • скриптов,
  • картинок,
  • аудио- и видеофайлов,
  • CSS-стилей,
  • шрифтов.

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

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

Покажите примеры

Мы хотим запретить выполнение чужих скриптов на странице. За это отвечает свойство script-srс, у которого может быть один из этих параметров:

  • ‘self’ — означает, что можно выполнять только те скрипты, которые лежат на том же сервере, что и страница
  • ‘none’ — вообще запрещает любые скрипты на странице, даже если они там есть
  • ‘unsafe-inline’ — опасно, потому что этот параметр разрешает выполнение любых внешних скриптов на странице

Получается, что для блокировки всех чужих скриптов на странице нам достаточно написать в политике безопасности:

Content-Security-Policy: script-src 'self'

Если мы ещё доверяем серверам Яндекса и хотим встраивать их скрипты у себя на страницах (например, плагины Яндекс Музыки), то можем написать так:

Content-Security-Policy: script-src 'self' yandex.ru

Когда мы вообще не доверяем никому и хотим сами контролировать и поставлять весь контент на странице, то используем свойство default-src. Оно отвечает за все источники сразу, хоть скрипты, хоть картинки. Поэтому наша политика безопасности в этом случае может выглядеть так:

Content-Security-Policy: default-src 'self'

А как это использовать?

Чтобы вся эта магия работала, нам нужно сообщить браузеру о нашей политике безопасности. Это можно сделать несколькими способами.

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

<ifModule mod_headers.c>

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

</ifModule>

Если у вас на хостинге стоит отдельный веб-сервер Apache, то в его конфигурационный файл httpd.conf можно написать так:

Header set Content-Security-Policy "default-src 'self';"

Настроить политику на уровне движка сайта. Например, у вас есть сайт на Вордпрессе или другой CMS, которая работает на PHP. Тогда мы можем добавить в модуль, который отвечает за сборку страницы, такую строку:

header("Content-Security-Policy: default-src 'self'");

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

Вручную писать нужные параметры в метатегах внутри страницы. Это самый сложный путь — нам придётся написать теги внутри каждой страницы. Ещё один минус такого решения — теги не действуют на ресурсы, которые расположены на странице перед ним. Например, в разделе <head> мы подключим скрипты и стили, расположенные на других сайтах, а потом напишем так:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

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

И что, этого достаточно?

Нет, но это ещё один уровень защиты сайта от злоумышленников и хакеров. Вот несколько других инструментов:

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

И есть вещи, с которыми очень сложно бороться с помощью программирования, — например, фишинг и социальная инженерия. Но всё это темы для отдельных разговоров.

Что дальше

Дальше настроим политику безопасности на нашем учебно-боевом сервере и проверим, как она работает. Заодно посмотрим, какие ещё у неё есть важные параметры и как ими управлять.

Текст:

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

Редактор:

Максим Ильяхов

Художник:

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

Корректор:

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

Вёрстка:

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

Соцсети:

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

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Зачем нужна командная строка в современных компьютерах

Разбираемся на Маках и Винде.

medium
Как устроен спутниковый интернет
Как устроен спутниковый интернет

Надёжно, но с большими задержками.

easy
Как работает беспроводная зарядка
Как работает беспроводная зарядка

Всё дело в магнитном поле.

easy
Как в России появился каршеринг
Как в России появился каршеринг

Конспект подкаста «Запуск завтра»

easy
Зарплата 113 тысяч за то, чтобы ломать программы
Зарплата 113 тысяч за то, чтобы ломать программы

Работа тестировщика как она есть.

easy
Превращаем домашний компьютер в полноценный веб-сервер: пошаговое руководство
Превращаем домашний компьютер в полноценный веб-сервер: пошаговое руководство

Местами сложно, зато всё своё

hard
6 признаков того, что вы растёте как программист
6 признаков того, что вы растёте как программист

Если сомневаетесь — не сомневайтесь

easy
JavaScript для новичков: чем опасны нестрогие типы данных
JavaScript для новичков: чем опасны нестрогие типы данных

В JavaScript есть удобная штука, которая может сильно вам навредить.

medium
Языку C уже почти 50 лет, но он всё равно крут
Языку C уже почти 50 лет, но он всё равно крут

Почему на нём программируют до сих пор.

easy
medium
[anycomment]
Exit mobile version