Ajax,CSRF&CORS-Django REST框架
使用Ajax、CSRF和CORS
“仔细观察一下你自己网站上可能存在的CSRF/XSRF漏洞。它们是最糟糕的漏洞--攻击者很容易利用它们,但对软件开发人员来说,这并不是那么直观的理解,至少在你被人咬伤之前是如此。”
— 杰夫·阿特伍德
JavaScript客户端
如果要构建JavaScript客户端以与Web API接口,则需要考虑客户端是否可以使用与网站其他部分使用的相同的身份验证策略,并确定是否需要使用CSRF令牌或CORS标头。
在与其交互的api上下文中发出的Ajax请求通常将使用SessionAuthentication
...这可以确保一旦用户登录,任何Ajax请求都可以使用与网站其余部分相同的基于会话的身份验证进行身份验证。
在与其通信的api不同站点上发出的ajax请求通常需要使用非基于会话的身份验证方案,如TokenAuthentication
.
CSRF保护
跨站点请求伪造保护是一种防范特定类型攻击的机制,当用户尚未从网站注销并继续拥有有效会话时,就会发生这种攻击。在这种情况下,恶意站点可以在登录会话的上下文中对目标站点执行操作。
为了防范这类攻击,您需要做两件事:
- 确保“安全”HTTP操作,如
GET
,HEAD
和OPTIONS
不能用于更改任何服务器端状态。 - 确保任何“不安全的”HTTP操作,例如
POST
,PUT
,PATCH
和DELETE
,总是需要有效的CSRF令牌。
如果你用SessionAuthentication
您需要包含任何有效的CSRF令牌POST
, PUT
, PATCH
或DELETE
行动。
为了发出Ajax请求,您需要在HTTP报头中包含CSRF令牌,如Django文档中描述了.
CORS
跨源资源共享是一种允许客户端与托管在不同域上的API交互的机制。CORS的工作方式是要求服务器包含一组特定的标头,允许浏览器确定是否以及何时允许跨域请求。
在REST框架中处理CORS的最佳方法是在中间件中添加所需的响应头。这可以确保CORS得到透明的支持,而不必更改视图中的任何行为。
奥托·姚维护Django-CORS-标头软件包,它可以正确地与RESTFrameworkAPI一起工作。
网友评论