Перейти к содержанию

HTTP клиент — Безопасность: Защита от подделки межсайтовых запросов (XSRF)

📅 14.11.2022

Cross-Site Request Forgery (XSRF или CSRF) — это техника атаки, с помощью которой злоумышленник может обманом заставить аутентифицированного пользователя неосознанно выполнить действия на вашем сайте.

HttpClient поддерживает общий механизм, используемый для предотвращения XSRF-атак. При выполнении HTTP-запросов перехватчик считывает маркер из cookie, по умолчанию XSRF-TOKEN, и устанавливает его в качестве HTTP-заголовка X-XSRF-TOKEN.

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

По умолчанию перехватчик отправляет этот заголовок на все мутирующие запросы (такие как POST) к относительным URL, но не на GET/HEAD запросы или на запросы с абсолютным URL.

Чтобы воспользоваться этим преимуществом, ваш сервер должен установить маркер в JavaScript-читаемый сессионный файл cookie под названием XSRF-TOKEN либо при загрузке страницы, либо при первом GET-запросе. При последующих запросах сервер может проверить, что cookie соответствует HTTP-заголовку X-XSRF-TOKEN, и таким образом быть уверенным, что запрос мог отправить только код, запущенный на вашем домене. Токен должен быть уникальным для каждого пользователя и проверяться сервером; это не позволит клиенту придумывать свои собственные токены.

Для повышения безопасности установите в качестве маркера дайджест cookie аутентификации вашего сайта с солью.

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

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

Настройка пользовательских имен куки/заголовков

Если ваш внутренний сервис использует другие имена для куки или заголовков токенов XSRF, используйте HttpClientXsrfModule.withOptions() для переопределения значений по умолчанию.

1
2
3
4
5
6
7
imports: [
  HttpClientModule,
  HttpClientXsrfModule.withOptions({
    cookieName: 'My-Xsrf-Cookie',
    headerName: 'My-Xsrf-Header',
  }),
],

Комментарии