CSRF и другие атаки

Mithril.js — легковесный JavaScript-фреймворк для создания одностраничных приложений (SPA). Несмотря на свою простоту, приложения на Mithril подвержены стандартным веб-угрозам, включая CSRF, XSS и другие виды атак. Понимание и предотвращение этих угроз критично для безопасности.


CSRF (Cross-Site Request Forgery)

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

Механизм атаки:

  1. Пользователь аутентифицирован на сайте example.com.
  2. Злоумышленник размещает на своём сайте форму или скрипт, отправляющий запрос к example.com.
  3. Браузер автоматически добавляет куки сессии к запросу.
  4. Сервер обрабатывает запрос, считая его легитимным.

Защита в Mithril.js:

  • Использование CSRF-токенов. При каждом безопасном запросе (POST, PUT, DELETE) в заголовке или теле отправляется уникальный токен:

    m.request({
        method: "POST",
        url: "/api/update",
        body: { data: formData },
        headers: {
            "X-CSRF-Token": window.csrfToken
        }
    });

    На серверной стороне токен проверяется на соответствие сессии пользователя.

  • SameSite куки. Установка флага SameSite=Lax или Strict предотвращает отправку куки сторонними сайтами:

    Set-Cookie: sessionId=abc123; SameSite=Strict; HttpOnly; Secure
  • Проверка Origin и Referer. Сервер может блокировать запросы, если они поступают с чужого домена.


XSS (Cross-Site Scripting)

XSS возникает, когда злоумышленник внедряет скрипт на страницу, который затем выполняется в браузере других пользователей. В Mithril.js это особенно критично при работе с пользовательским вводом.

Принципы безопасного рендеринга:

  • Использование m() вместо innerHTML. Mithril автоматически экранирует текст:

    m("div", userInput) // безопасно
  • Избегать вставки сырого HTML. Если необходимо использовать HTML, применять безопасное экранирование или специализированные библиотеки:

    m.trust(safeHTML) // только после полной проверки

Clickjacking

Clickjacking — техника, когда злоумышленник размещает прозрачный iframe поверх легитимного интерфейса, заставляя пользователя выполнять скрытые действия.

Защита:

  • HTTP-заголовок X-Frame-Options:

    X-Frame-Options: DENY
  • Современная альтернатива — Content Security Policy:

    Content-Security-Policy: frame-ancestors 'none';

SQL Injection и NoSQL Injection

Хотя Mithril.js работает на клиентской стороне, уязвимости к SQL или NoSQL injection проявляются на сервере. Клиентские данные не должны напрямую формировать запросы к базе данных.

Практики безопасности:

  • Использование подготовленных выражений (prepared statements) на сервере.
  • Валидация и санитизация всех входных данных.
  • Ограничение прав пользователя на операции с базой данных.

Аутентификация и управление сессиями

  • Хранение токенов в localStorage потенциально опасно, так как доступ к нему имеет любой скрипт на странице. Рекомендуется использовать HttpOnly куки.
  • Для SPA важно реализовать токен-рефреш, чтобы продлить сессию без постоянного хранения логина и пароля.

Практические примеры с Mithril.js

  • Безопасный POST-запрос с токеном CSRF:
m.request({
    method: "POST",
    url: "/api/submit",
    body: { name: "Alice", message: "Hello" },
    headers: { "X-CSRF-Token": window.csrfToken }
}).then(response => {
    console.log("Submitted successfully", response);
});
  • Защищённый рендеринг пользовательского текста:
const safeText = sanitize(userInput);
m("p", safeText);

Выводы по безопасности Mithril.js

  • Клиентская безопасность зависит от правильной конфигурации сервера и безопасного рендеринга данных.
  • CSRF, XSS, Clickjacking и инъекции остаются основными угрозами для SPA.
  • Регулярное использование токенов, безопасных заголовков и санитизации данных значительно снижает риски.