我的网站有一个页面,包含2个表单和3个基于ajax的POST调用。我在其中一个表单中使用了csrf_token
。另外,为了能够执行csrf-safe ajax调用,我使用官方文档中发布的指南:https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/和此博客:https://realpython.com/blog/python/django-and-ajax-form-submissions/
正如所建议的那样,通过在我的javascript文件中使用此代码https://gist.github.com/broinjc/db6e0ac214c355c887e5,似乎我能够毫无问题地执行POST请求。
问题:
csrf_token
以及javascript代码(如上所述)是否足以确保csrf伪造?我应该在第二种形式中使用csrf_token
吗? {% csrf_token %}
而不是帖子中提到的隐藏字段。我没有在我的第二种形式中使用任何csrf_token
。 views.py
功能检查呼叫csrf
是否安全? 如果您需要更多信息,请告诉我,我将很乐意进一步阐述。
答案 0 :(得分:3)
在其中一种形式中使用csrf_token以及javascript代码(如上所述)是否足以确保csrf伪造?我可以做 在第二种形式中使用csrf_token?
我希望不会;)在Django中启用CsrfViewMiddleware
就足以确保您的视图受到 跨站点请求伪造的保护。如果您使用两个单独的HTML表单(两个<form></form>
标记),则两个表单都需要具有隐藏的CSRF标记字段。如果您在一个form
标记中使用两个Django表单,则只需要一次。
如果该javascript代码段会发送带有任何请求的令牌,而不仅仅是AJAX请求,那么您只需要一次令牌,但我不相信它,所以您需要在每个HTML表单中使用它。
正如此SO帖子中所建议的那样为多个生成CSRF令牌 单个页面上的表单似乎使用相同的令牌应该没问题。 但是,为了清楚起见,我在第一次使用{%csrf_token%} 形式而不是帖子中提到的隐藏字段。而我不是 在我的第二种形式中使用任何csrf_token。
{% csrf_token %}
标记会为您创建一个隐藏字段,因此基本上 使用隐藏字段。
我应该为我的ajax电话做些额外的事情还是没事?
您包含的javascript会在每个AJAX请求中为每个CSRF令牌的值设置一个标头。此标头替换通常由表单中的隐藏字段发送的帖子数据。你通过jQuery发送的任何AJAX调用都有这个标题,你不需要做任何其他事情。
有没有办法检查views.py函数,该调用是csrf安全吗?
不是真的。只要您启用了CsrfViewMiddleware
并且您未使用csrf_exempt
装饰器,您的视图就会受到保护。如果调用不安全,中间件将在请求到达视图之前返回403 Forbidden
响应。