Работа с AJAX, CSRF и CORS

«Внимательно изучите возможные уязвимости CSRF / XSRF на ваших собственных сайтах. Это худший вид уязвимостей ‒ их очень легко использовать злоумышленникам, но не так интуитивно легко понять разработчикам программного обеспечения, по крайней мере, пока вас не укусит одна из них.»

Jeff Atwood

Клиенты Javascript

Если вы создаете JavaScript-клиент для взаимодействия с вашим Web API, вам нужно подумать, может ли клиент использовать ту же политику аутентификации, которая используется остальной частью сайта, а также определить, нужно ли вам использовать CSRF-токены или CORS-заголовки.

AJAX-запросы, выполняемые в том же контексте, что и API, с которым они взаимодействуют, обычно используют SessionAuthentication. Это гарантирует, что после того, как пользователь вошел в систему, любые запросы AJAX могут быть аутентифицированы с помощью той же аутентификации на основе сеанса, которая используется для остальной части сайта.

AJAX-запросы, которые выполняются на сайте, отличном от сайта API, с которым они взаимодействуют, обычно должны использовать схему аутентификации, не основанную на сеансах, например TokenAuthentication.

Защита от CSRF

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

Чтобы защититься от такого рода атак, вам нужно сделать две вещи:

  1. Убедитесь, что «безопасные» операции HTTP, такие как GET , HEAD и OPTIONS не могут быть использованы для изменения состояния на стороне сервера.

  2. Убедитесь, что любые «небезопасные» операции HTTP, такие как POST , PUT , PATCH и DELETE , всегда требуют действительного маркера CSRF.

Если вы используете SessionAuthentication, вам необходимо включить действительные CSRF-токены для любых POST , PUT , PATCH или DELETE операций.

Для выполнения AJAX-запросов необходимо включить CSRF-токен в HTTP-заголовок, как described in the Django documentation.

CORS

Cross-Origin Resource Sharing - это механизм, позволяющий клиентам взаимодействовать с API, размещенными на другом домене. CORS работает, требуя от сервера включения определенного набора заголовков, которые позволяют браузеру определить, разрешены ли междоменные запросы и когда они должны быть разрешены.

Лучшим способом решения проблемы CORS в REST-фреймворке является добавление необходимых заголовков ответа в промежуточное ПО. Это гарантирует, что CORS поддерживается прозрачно, без необходимости изменять какое-либо поведение в ваших представлениях.

Otto Yiu поддерживает пакет django-cors-headers, который, как известно, корректно работает с API REST framework.

Вернуться на верх