2015-08-12 3 views
1

У меня есть приложение Django для электронной коммерции, которое автоматически проверяет все входящие запросы с помощью токена CSRF, используя CSRFViewMiddleware.Руководство по проверке CSRF

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

403 Forbidden 
CSRF verification failed. Request aborted. 

Как исправить это? Есть ли способ, которым я могу вручную проверить csrftoken, используя request.POST.get('csrfmiddlewaretoken') или что-то в этом роде.

Я бы предпочел не обойти csrf полностью, как я хочу, чтобы он был безопасным (по крайней мере, насколько это возможно).

Редактировать Я понимаю csrfmiddleware маркера должен быть передан в заголовке, но я не могу этого сделать, поскольку есть только ограниченные вещи, которые я могу сделать с 3-платежным шлюзом стороны.

+2

Вам не следует передавать токен CSRF на сторонние сайты. –

+0

@BurhanKhalid достаточно честный. Дело в том, что у меня есть несколько вариантов оплаты, где я обрабатываю некоторые параметры, а другие обрабатываются сторонним сайтом. Как мне защитить этот процесс?) –

+0

В отличие от человека, любая наполовину достойная внешняя служба не может быть обманута при отправке запроса на ваш сайт с информацией с другого сайта (злоумышленника). Большинство из них также не зависят от файлов cookie или сеансов, поэтому атаки CSRF по своей сути бесполезны. Вы защищаете запрос каким-либо механизмом аутентификации, предоставляемым сторонним сервисом. – knbk

ответ

2

Из этого фрагмента кода, я получаю ощущение, что вы не можете вполне понять, что CSRF:

У меня есть электронной коммерции Django приложение, которое автоматически проверяет все входящие запросы POST с CSRF токен, используя CSRFViewMiddleware.

Это часть вашей проблемы прямо там. CSRF только для тех запросов, которые сделаны с вашего сайта на свой сайт (см OWASP's definition of CSRF):

Запрос Cross-Site подлог (CSRF) представляет собой тип атаки, которая возникает, когда вредоносный веб-сайт, электронная почта , блог, мгновенное сообщение или программа вызывает веб-браузер пользователя для выполнения нежелательного действия на доверенном сайте , для которого пользователь в настоящее время проходит проверку подлинности.

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

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

+0

Да. Это очищает мой мыслительный процесс. Поэтому я попытался использовать @csrf_exempt над своим почтовым представлением, которое принимает почтовые запросы, но я все равно получаю ошибку Csrf 403. Любая идея почему? –

+0

'csrf_exempt' должен предотвращать ошибки CSRF. Если вы все еще получаете ошибки, убедитесь, что на самом деле вызывается исключение, и опубликуйте представление. – Alasdair

Смежные вопросы