可以在Django中为松弛斜杠命令api禁用CSRF吗?

时间:2018-07-31 06:42:42

标签: django csrf slack slack-commands

禁用CSRF功能是否是Slack斜杠命令服务器的最佳实践?

我想通过Slack slash command(例如/test)在Django中调用API视图函数。

当我使用任何浏览器调用视图函数的URL(因此它是GET请求)时,它都会按预期工作。

但是,当我在Slack中运行/test时,我的403_client_error处于松弛状态,而Forbidden (CSRF cookie not set)则处于Django Shell中。

我相信这是因为Slack发送POST请求,而Django对于任何POST请求都需要CSRF令牌。

我的问题是是否应禁用此视图的CSRF检查。会有很大的风险吗?还是有任何解决方法?

1 个答案:

答案 0 :(得分:1)

简短答案:

是的,对于API端点来说很好。

更长的答案:

跨站点请求伪造(CSRF)令牌是一种防止CSRF攻击的手段。这些攻击基本上是通过在用户访问该站点时运行的另一个站点上放置一些恶意代码来起作用的。加载恶意网站后,将运行一些JavaScript代码,并将POST请求提交给已在其上进行身份验证的受害者的网站。由于用户已经通过身份验证,因此其他站点的服务器(例如,银行)认为用户实际上是在发出此请求,例如向攻击者发送了100美元,然后继续处理该请求。这是CSRF攻击和令牌的一个很好的描述:https://stackoverflow.com/a/33829607/8068625

CSRF令牌防止这种情况的方法是,将令牌放置在任何包含表单的页面上的某处,并且在提交时,该令牌将作为表单上的其他字段提交。这样,必须实际访问该页面(攻击者就无法完成该页面)才能提交该页面。

因此,只要您要从中删除CSRF保护的页面上没有您不希望攻击者提交的表单,就可以在视图中添加@csrf_exempt。似乎是这种情况,因为该端点仅作为Slack Slash Command的API端点存在。

您可以考虑为API端点添加其他形式的身份验证(请注意,CSRF不适用于API),例如JSON Web Tokens。但这取决于您。