Можно ли отключить CSRF для команды слабого слэша api mad в Django?
Является ли отключение функции CSRF лучшей практикой для сервера команд Slack slash?
Я хочу вызвать функцию представления API в Django с помощью команды Slack slash, например: /test
,
Когда я вызываю URL для функции просмотра в любом браузере (так что это запрос GET), он работает как положено.
Тем не менее, когда я бегу /test
в Slack, я получил 403_client_error
в расслабленном состоянии, и Forbidden (CSRF cookie not set)
в оболочке Джанго.
Я полагаю, что это потому, что Slack отправляет запрос POST, а Django требует токен CSRF для любых запросов POST.
У меня вопрос, должен ли я отключить проверку CSRF для этого представления. Будет ли существенный риск? Или есть ли обходной путь?
1 ответ
Короткий ответ:
Да, это хорошо для конечной точки API.
Более длинный ответ:
Токены подделки межсайтовых запросов (CSRF) являются средством предотвращения атак CSRF. Эти атаки в основном работают путем размещения некоторого вредоносного кода на другом сайте, который запускается, когда пользователь посещает этот сайт. После загрузки вредоносного сайта запускается некоторый код JavaScript, который отправляет запрос POST на сайт, на котором жертва уже прошла проверку подлинности. Поскольку пользователь уже аутентифицирован, сервер другого сайта - например, банк - считает, что пользователь фактически делает этот запрос - например, отправляет злоумышленнику 100 долларов США, - и продолжает и обрабатывает запрос. Вот действительно хорошее описание атак и токенов CSRF: /questions/16493641/chto-takoe-token-csrf-kakovo-ego-znachenie-i-kak-ono-rabotaet/16493663#16493663
Способ, с помощью которого токены CSRF предотвращают это, помещает токен где-нибудь на любую страницу, которая содержит форму, и этот токен передается в виде дополнительного поля в форме при отправке. Таким образом, страница действительно должна быть посещена (что злоумышленник не должен выполнить), чтобы отправить страницу.
Таким образом, до тех пор, пока на этой странице, с которой вы снимаете защиту CSRF, нет формы, которую вы бы не хотели отправлять злоумышленнику, можно добавить @csrf_exempt
на вид. Похоже, что это так, поскольку конечная точка существует исключительно как конечная точка API для команды Slack Slash.
Вы можете рассмотреть возможность добавления какой-либо другой формы аутентификации для ваших конечных точек API (обратите внимание, что CSRF не предназначен для использования в API), например, JSON Web Tokens. Но это зависит от вас.