Содержание

    Введение в безопасность веб-приложений

    Современные веб-приложения обрабатывают огромные объемы конфиденциальных данных — от персональной информации пользователей до финансовых транзакций. Однако чем сложнее становится функционал, тем больше потенциальных уязвимостей появляется.

    По данным OWASP (Open Web Application Security Project), наиболее опасными угрозами остаются:

    • XSS (Cross-Site Scripting) — внедрение вредоносных скриптов.
    • CSRF (Cross-Site Request Forgery) — подделка запросов от имени пользователя.
    • SQL-инъекции — атаки на базы данных.

    Эти уязвимости могут привести к:
    ✔ Краже сессий и учетных данных.
    ✔ Утечке конфиденциальных данных.
    ✔ Финансовым потерям и репутационному ущербу.

    Давайте разберем каждую угрозу подробно и рассмотрим эффективные методы защиты.


    1. XSS (Cross-Site Scripting) — межсайтовый скриптинг

    1.1. Что такое XSS и как это работает?

    XSS — это атака, при которой злоумышленник внедряет произвольный JavaScript-код в веб-страницу. Когда пользователь открывает такую страницу, скрипт выполняется в его браузере с правами жертвы.

    Пример атаки:

    Допустим, на сайте есть форма комментариев, которая не фильтрует HTML-теги. Злоумышленник может оставить комментарий:

    html

    <script>alert('XSS!');</script>

    При загрузке страницы у всех пользователей будет выводиться всплывающее окно. В реальных атаках вместо alert может быть код, ворующий куки или перенаправляющий на фишинговый сайт.

    1.2. Типы XSS-атак

    Тип XSSОписаниеПример
    Reflected XSSСкрипт передается через URL и отражается на страницеsite.com/search?q=<script>alert(1)</script>
    Stored XSSВредоносный код сохраняется на сервере (например, в базе данных)Вредоносный комментарий в блоге
    DOM-based XSSАтака происходит на стороне клиента без отправки данных на серверИзменение document.location через фрагмент URL

    1.3. Реальные последствия XSS

    ✔ Кража сессий через document.cookie.
    ✔ Кейлоггинг — перехват нажатий клавиш.
    ✔ Подмена контента (например, добавление фальшивых форм ввода).
    ✔ Распространение вредоносного ПО через эксплойты в браузере.

    1.4. Как защититься от XSS?

    1.4.1. Экранирование (HTML-encoding)

    Преобразование опасных символов в HTML-сущности:

    javascript

    function escapeHtml(text) {

      return text

        .replace(/&/g, "&amp;")

        .replace(/</g, "&lt;")

        .replace(/>/g, "&gt;")

        .replace(/"/g, "&quot;")

        .replace(/'/g, "&#039;");

    }

    Используйте встроенные функции:

    • PHP: htmlspecialchars()
    • Python (Django): django.utils.html.escape()
    • JavaScript: textContent вместо innerHTML

    1.4.2. Content Security Policy (CSP)

    CSP — это HTTP-заголовок, ограничивающий источники скриптов, стилей и других ресурсов.
    Пример политики:

    text

    Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com

    Это предотвратит выполнение inline-скриптов и загрузку кода с посторонних сайтов.

    1.4.3. HttpOnly и Secure-флаги для куки

    Установка этих флагов защищает куки от кражи через XSS:

    text

    Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict

    • HttpOnly — запрещает доступ к куки через JavaScript.
    • Secure — передача куки только по HTTPS.
    • SameSite — блокирует отправку куки с других доменов.

    1.4.4. Санитизация ввода

    Используйте библиотеки для очистки HTML:

    • DOMPurify (JavaScript)
    • sanitize-html (Node.js)
    • HTMLSanitizer (PHP)

    Пример с DOMPurify:

    javascript

    import DOMPurify from 'dompurify';

    const clean = DOMPurify.sanitize(userInput);


    2. CSRF (Cross-Site Request Forgery) — межсайтовая подделка запроса

    2.1. Суть CSRF-атаки

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

    Пример сценария:

    1. Пользователь входит в интернет-банк.
    2. Переходит на вредоносный сайт, где размещен скрипт:

    html

    <img src="https://bank.com/transfer?to=attacker&amount=1000" width="0" height="0">

    1. Браузер отправляет запрос на перевод денег с куки пользователя.

    2.2. Как защититься от CSRF?

    2.2.1. CSRF-токены

    Сервер генерирует уникальный токен для каждой формы:

    html

    <form action="/transfer" method="POST">

      <input type="hidden" name="csrf_token" value="a1b2c3d4e5">

      <!-- остальные поля -->

    </form>

    Сервер проверяет токен перед выполнением действия.

    2.2.2. SameSite-атрибут для куки

    text

    Set-Cookie: session=xyz; SameSite=Strict

    • Strict — куки отправляются только с того же сайта.
    • Lax — разрешает GET-запросы с других доменов (безопасный компромисс).

    2.2.3. Проверка заголовков Origin и Referer

    Сервер должен отклонять запросы с неправильными заголовками:

    python

    if request.headers.get('Origin') != 'https://my-site.com':

        return abort(403)


    3. SQL-инъекции

    3.1. Как работают SQL-инъекции?

    Если приложение формирует SQL-запросы путем конкатенации строк, злоумышленник может внедрить произвольный код.

    Пример уязвимого кода (PHP):

    php

    $query = "SELECT * FROM users WHERE login = '" . $_POST['login'] . "'";

    Если ввести ' OR '1'='1, запрос станет:

    sql

    SELECT * FROM users WHERE login = '' OR '1'='1'

    Результат: возвращаются все записи из таблицы.

    3.2. Защита от SQL-инъекций

    3.2.1. Подготовленные выражения (Prepared Statements)

    php

    $stmt = $pdo->prepare("SELECT * FROM users WHERE login = ?");

    $stmt->execute([$_POST['login']]);

    Параметры автоматически экранируются.

    3.2.2. ORM (Hibernate, Sequelize, Django ORM)

    ORM преобразует операции в безопасные SQL-запросы:

    python

    # Django пример

    User.objects.filter(login=request.POST['login'])

    3.2.3. Минимальные привилегии БД

    Запретите веб-приложению:

    • Выполнять DROP TABLE, DELETE.
    • Доступ к системным таблицам.

    Заключение

    Безопасность веб-приложений требует комплексного подхода:
    ✔ Фильтрация и валидация всех входящих данных.
    ✔ Использование безопасных API (Prepared Statements, CSP).
    ✔ Регулярное тестирование (OWASP ZAP, Burp Suite).

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

    Редакция LoadFile

    author avatar
    Редакция Loadfile