是否禁用CSRF功能是Slack斜杠命令服务器的最佳实践?
我想通过Slack slash command在Django中调用API视图函数,例如 /test
.
当我使用任何浏览器调用视图函数的URL时(因此它是GET请求),它按预期工作 .
但是,当我在Slack中运行 /test
时,我得到了松弛的 403_client_error
和Django shell中的 Forbidden (CSRF cookie not set)
.
我相信这是因为Slack发送POST请求,而Django需要CSRF令牌来处理任何POST请求 .
我的问题是我是否应该禁用此视图的CSRF检查 . 会有重大风险吗?或者有任何解决方法吗?
1 回答
Short Answer:
是的,它适用于API endpoints .
Longer Answer:
跨站请求伪造(CSRF)令牌是一种防止CSRF攻击的方法 . 这些攻击基本上是通过将一些恶意代码放在用户访问该站点时运行的另一个站点上来实现的 . 加载恶意站点后,会运行一些JavaScript代码并向受害者已经过身份验证的站点提交POST请求 . 由于用户已经过身份验证,因此其他站点的服务器(例如银行)认为用户实际发出此请求 - 例如向攻击者发送100美元 - 然后继续处理请求 . 这是对CSRF攻击和令牌的非常好的描述:https://stackoverflow.com/a/33829607/8068625
CSRF令牌阻止这种情况的方法是在任何包含表单的页面上放置一个令牌,并在提交时将该令牌作为表单上的附加字段提交 . 这样,为了提交页面,必须实际访问页面(攻击者无法完成访问) .
因此,只要您删除CSRF保护的页面上没有您不希望由攻击者提交的表单,就可以将
@csrf_exempt
添加到视图中 . 似乎是这种情况,因为 endpoints 仅作为Slack Slash命令的API endpoints 存在 .您可以考虑为API endpoints 添加一些其他形式的身份验证(请注意,CSRF不适用于API),例如JSON Web Tokens . 但这取决于你 .