【问题标题】:Is it okay to disable CSRF for slack slash command api mad in Django?可以在 Django 中为 slack slash command api mad 禁用 CSRF 吗?
【发布时间】:2018-08-01 09:50:34
【问题描述】:

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

我想通过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 检查。会不会有很大的风险?或者有什么解决办法?

【问题讨论】:

  • 我可以通过在视图顶部添加 @csrf_exempt 来禁用 CSRF,然后 slack 命令可以正常工作。

标签: django csrf slack slack-commands


【解决方案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。但这取决于你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-27
    • 1970-01-01
    • 2013-07-31
    • 2015-04-28
    相关资源
    最近更新 更多