0

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

我想通过Slack 斜杠命令调用 Django 中的 API 视图函数,例如/test.

当我使用任何浏览器调用视图函数的 URL 时(所以它是一个 GET 请求),它按预期工作。

然而,当我/test在 Slack 中运行时,我进入403_client_error了 slack 和Forbidden (CSRF cookie not set)Django shell。

我相信这是因为 Slack 发送了一个 POST 请求,而 Django 需要 CSRF 令牌来处理任何 POST 请求。

我的问题是我是否应该为此视图禁用 CSRF 检查。会不会有很大的风险?或者有什么解决方法吗?

4

1 回答 1

1

简短的回答:

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

更长的答案:

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

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

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

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

于 2018-08-01T01:50:34.717 回答