是否可以为 Django 中的 slack slash 命令 api mad 禁用 CSRF?

Is it okay to disable CSRF for slack slash command api mad in Django?

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

我想通过Slack slash command在Django中调用一个API视图函数,例如/test

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

然而,当我在 Slack 中 运行 /test 时,我在 Slack 中得到 403_client_error,在 Django shell 中得到 Forbidden (CSRF cookie not set)

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

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

简答:

是的,API 端点没问题。

更长的答案:

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

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

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

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