AJAX, CSRF & CORS
"Внимательно изучите возможные уязвимости CSRF / XSRF на ваших собственных сайтах. Это худший вид уязвимостей - их очень легко использовать злоумышленникам, но не так просто интуитивно понять разработчикам программного обеспечения, по крайней мере, пока вас не укусит одна из них."
Клиенты Javascript
Если вы создаете JavaScript-клиент для взаимодействия с вашим Web API, вам нужно подумать, может ли клиент использовать ту же политику аутентификации, которая используется остальной частью сайта, а также определить, нужно ли вам использовать CSRF-токены или CORS-заголовки.
AJAX-запросы, выполняемые в том же контексте, что и API, с которым они взаимодействуют, обычно используют SessionAuthentication. Это гарантирует, что после того, как пользователь вошел в систему, любые запросы AJAX могут быть аутентифицированы с помощью той же сеансовой аутентификации, которая используется для остальной части сайта.
AJAX-запросы, которые выполняются на сайте, отличном от сайта API, с которым они взаимодействуют, обычно должны использовать схему аутентификации, не основанную на сеансах, например TokenAuthentication.
Защита от CSRF
Защита от подделки межсайтовых запросов - это механизм защиты от определенного типа атак, которые могут возникнуть, когда пользователь не вышел с веб-сайта и продолжает иметь действующую сессию. В этом случае вредоносный сайт может выполнить действия против целевого сайта в контексте вошедшей сессии.
Чтобы защититься от такого рода атак, вам нужно сделать две вещи:
Убедитесь, что "безопасные" операции HTTP, такие как
GET,HEADиOPTIONS, не могут быть использованы для изменения состояния на стороне сервера.Убедитесь, что для любых "небезопасных" операций HTTP, таких как
POST,PUT,PATCHиDELETE, всегда требуется действительный токен CSRF.
Если вы используете SessionAuthentication, вам необходимо включить действительные CSRF-токены для любых операций POST, PUT, PATCH или DELETE.
Чтобы выполнять AJAX-запросы, необходимо включить CSRF-токен в HTTP-заголовок, как описано в документации Django.
CORS
Cross-Origin Resource Sharing - это механизм, позволяющий клиентам взаимодействовать с API, размещенными на другом домене. CORS работает, требуя от сервера включения определенного набора заголовков, которые позволяют браузеру определить, разрешены ли междоменные запросы и когда они должны быть разрешены.
Лучший способ справиться с CORS в DRF - добавить необходимые заголовки ответа в middleware. Это гарантирует, что CORS поддерживается прозрачно, без необходимости изменять какое-либо поведение в ваших представлениях.
Adam Johnson поддерживает пакет django-cors-headers, который, как известно, корректно работает с API DRF.
Last updated
Was this helpful?