CSRF токены

Веб-приложения, использующие фреймворк Solid.js, должны быть защищены от различных типов атак, включая Cross-Site Request Forgery (CSRF). Это тип атаки, при которой злоумышленник отправляет нежелательные запросы от имени пользователя, который в данный момент авторизован в приложении. Для защиты от таких атак используются механизмы, такие как CSRF-токены.

Что такое CSRF токен

CSRF токен — это уникальный секретный ключ, генерируемый сервером и передаваемый клиенту для защиты от подделки запросов. Этот токен необходимо отправить с каждым изменяющим запросом (например, POST, PUT или DELETE), чтобы сервер мог проверить, что запрос был инициирован легитимным пользователем, а не злоумышленником.

Зачем использовать CSRF токены

Атака CSRF обычно происходит следующим образом: пользователь авторизован на сайте, и злоумышленник размещает в интернете страницу с поддельной формой или скриптом. Этот скрипт пытается отправить запрос с тех же данных, что и на авторизованный сайт, например, сессией пользователя, которая была сохранена в браузере. При этом жертва может даже не подозревать, что с её аккаунтом выполняются нежелательные действия.

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

Как это работает

  1. Генерация токена: Когда пользователь загружает страницу, сервер генерирует CSRF токен и отправляет его в клиентскую часть, обычно через HTTP-куки или встраивает в HTML, например, в качестве мета-тега или скрытого поля формы.

  2. Передача токена: Клиентская сторона отправляет CSRF токен с каждым изменяющим запросом. Этот токен можно передавать как часть заголовков запросов (например, в X-CSRF-Token), либо включать в тело запроса в виде скрытого поля.

  3. Проверка на сервере: Сервер сравнивает переданный токен с тем, который хранится на стороне пользователя (обычно в сессии). Если токены совпадают, запрос считается легитимным, иначе он отклоняется.

Как внедрить CSRF защиту в Solid.js

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

1. Генерация и передача токена

Для передачи CSRF токена в Solid.js можно воспользоваться механизмами встроенными в серверную сторону или создать собственное решение, которое будет генерировать токен и передавать его в клиентскую часть через API.

Пример серверной стороны (Node.js/Express):

app.get('/api/get-csrf-token', (req, res) => {
  const csrfToken = generateCsrfToken(); // функция генерирует уникальный токен
  res.cookie('XSRF-TOKEN', csrfToken); // устанавливаем токен в cookie
  res.send({ csrfToken });
});

На стороне клиента можно использовать fetch или любую библиотеку для HTTP-запросов, чтобы получить этот токен и сохранить его, например, в локальном хранилище или в состоянии компонента.

Пример клиента (Solid.js):

import { createSignal, onCleanup } from 'solid-js';

const [csrfToken, setCsrfToken] = createSignal(null);

fetch('/api/get-csrf-token')
  .then((response) => response.json())
  .then((data) => {
    setCsrfToken(data.csrfToken);
  });

const handleSubmit = (event) => {
  event.preventDefault();
  fetch('/api/submit-form', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-CSRF-Token': csrfToken(),
    },
    body: JSON.stringify({ data: 'some data' }),
  });
};

В этом примере CSRF токен передается в заголовке X-CSRF-Token при отправке формы. Серверная часть должна проверять этот заголовок на соответствие с токеном в сессии пользователя.

2. Проверка токена на сервере

После того как сервер получает запрос с CSRF токеном, он должен проверить его на корректность. Пример для Node.js/Express:

app.post('/api/submit-form', (req, res) => {
  const csrfToken = req.headers['x-csrf-token'];
  if (!csrfToken || csrfToken !== req.cookies['XSRF-TOKEN']) {
    return res.status(403).send('CSRF token mismatch');
  }

  // Дальнейшая обработка запроса
});

Если токены не совпадают, сервер отклоняет запрос с кодом ошибки 403, предотвращая атаку.

Возможные проблемы и решения

  1. Совместимость с CORS: Если ваше приложение использует механизм CORS (Cross-Origin Resource Sharing), важно убедиться, что CSRF токены могут быть переданы между доменами. Это обычно требует настройки правильных заголовков для CORS и обеспечения, чтобы куки были доступны для межсайтовых запросов.

  2. Хранение токенов: Токены можно хранить в нескольких местах: в HTTP-куки, в заголовках, в теле запроса или в локальном хранилище. Однако важно убедиться, что токен будет доступен только для чтения, а также защищён от возможных атак, таких как XSS (межсайтовый скриптинг).

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

Преимущества использования CSRF токенов

  • Защита от атак: CSRF токены гарантируют, что только авторизованный пользователь может отправлять изменяющие запросы.
  • Совместимость с большинством серверов: Механизм CSRF токенов поддерживается большинством популярных серверных технологий и легко интегрируется в клиентскую часть.
  • Повышенная безопасность: Использование CSRF токенов значительно повышает безопасность веб-приложений, минимизируя риски, связанные с атакой подделки запросов.

Заключение

Использование CSRF токенов в Solid.js и других веб-приложениях является важной частью обеспечения безопасности. Это позволяет защитить пользователей от атак, которые могут использовать их аутентификацию для выполнения нежелательных действий. Важно правильно интегрировать механизмы генерации, передачи и проверки токенов, чтобы минимизировать риски и обеспечить высокий уровень защиты.