Работа с 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 Защита - это механизм защиты от определенного типа атак, который может возникнуть, когда пользователь не вышел из веб-сайта и продолжает иметь действующую сессию. В этом случае вредоносный сайт может иметь возможность выполнять действия против целевого сайта в контексте зарегистрированной сессии.
Чтобы защититься от такого рода атак, вам нужно сделать две вещи:
Убедитесь, что «безопасные» операции HTTP, такие как
GET
,HEAD
иOPTIONS
не могут быть использованы для изменения состояния на стороне сервера.Убедитесь, что любые «небезопасные» операции 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.