【问题标题】:Avoid csrf_token and use of @requires_csrf_token after @csrf_exempt避免 csrf_token 并在 @csrf_exempt 之后使用 @requires_csrf_token
【发布时间】:2019-07-18 15:18:04
【问题描述】:

我创建了一个 django 项目并设置了 urls.py、视图模型等。除了一件事,一切都很好。

urls.py sn-p:

urlpatterns = patterns('',
(r'^$', main_page),
(r'^sendcall/$', sendcall),
(r'^dial_ag/$', dial_ag),

所以我的 '/'、'/sendcall/' 工作正常,因为它们从我的模板表单获取 POST 请求并且 csrf_token 存在,所以完全没有问题。

现在这个 /dial_ag/ 网址将永远不会从我的应用程序中调用。此 url 将由第三方 API 调用(我在他们的应用程序中配置了此 url,因此他们将向此 url 发送 POST 请求)。我发现在这种情况下,views.py 中的视图 dial_ag 必须在装饰器 @csrf_exempt 下使用,否则第三方将始终得到 403 禁止响应,因为我猜 django 甚至希望这个请求中包含 csrf_token?

所以现在我让它工作了,但我在 stackoverflow 上阅读了关于在 @csrf_exempt 之后使用 @requires_csrf_token 来处理安全漏洞的信息——一种在内部以某种方式传递 csrf_token 并保护视图的方法:

@csrf_exempt
@requires_csrf_token
def my_protected_unprotected_view():
    ...

这就是我卡住的地方。我无法理解这个概念或找到一个很好的文档(是的 django 文档在这里没有帮助。)关于如何实现这个。我如何从 urls.py 本身将令牌传递给视图,这样我就不必只使用@csrf_exempt。第三方应用程序与项目没有任何关系,除了将 REQUEST 发送到我不应该有令牌但使用 @csrf_token 的 URL 是处理这种情况的最佳方法吗?

【问题讨论】:

    标签: python django


    【解决方案1】:
    • 如果您的第三方应用不修改您的数据,您可以选择 GET 请求。
    • 您可以使用@csrf_exempt,因为第三方应用程序无法在您的页面上运行。但是你应该 在您的代码中具有适当的身份验证和授权机制。

    【讨论】:

    • 感谢您的回复。 “但你的代码中应该有适当的身份验证和授权机制。”是的,API 确实在 REQUEST HEADER 中提供了一个签名,我可以在我的代码中验证该签名,确认该请求仅来自该第三方。我会避免 GET 请求。您是否有任何关于 @requires_csrf_token 的参考示例博客链接等?
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 2014-07-12
    • 2019-03-27
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多