[英]django: csrf_token for multiple forms and ajax requests on a single page
我的网站只有一个页面,其中包含2个表单和3个基于Ajax的POST调用。 我在其中一种形式中使用了csrf_token
。 此外,为了能够执行CSRF安全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 %}
,而不是帖子中提到的隐藏字段。 我在第二种形式中没有使用任何csrf_token
。 views.py
函数中的调用是csrf
安全的? 如果您需要更多信息,请告诉我,我很乐意进一步阐述。
在其中一种形式中使用csrf_token和javascript代码(如上所述)是否足以确保csrf伪造? 我应该以第二种形式使用csrf_token吗?
我希望不是;)在Django中启用CsrfViewMiddleware
足以确保保护您的视图免受跨站点请求伪造的侵害 。 如果使用两个单独的HTML表单(两个<form></form>
标记),则两个表单都需要具有隐藏的CSRF令牌字段。 如果在单个form
标签中使用两个Django表单,则只需一次。
如果该javascript代码段将随任何请求发送令牌,而不仅仅是AJAX请求,则您只需要令牌一次,但我不相信它会发送,因此您需要每种HTML形式的令牌。
正如在此SO post中建议的那样,在单个页面上为多个表单生成CSRF令牌似乎使用相同的令牌应该没问题。 但是,为了清楚起见,我在第一种形式中使用{%csrf_token%},而不是帖子中提到的隐藏字段。 我在第二种形式中没有使用任何csrf_token。
{% csrf_token %}
标签为您创建了一个隐藏字段,因此本质上您正在使用一个隐藏字段。
我应该为ajax通话做些额外的事情还是可以吗?
您包含的javascript在每个AJAX请求中都将标头设置为CSRF令牌的值。 此标题替换通常由表单中的隐藏字段发送的帖子数据。 您通过jQuery发送的任何AJAX调用都将具有此标头,而您无需执行其他任何操作。
有没有一种方法可以检查views.py函数中的调用是csrf安全的?
并不是的。 只要您启用了CsrfViewMiddleware
并且没有使用csrf_exempt
装饰器,您的视图就会受到保护。 如果调用不安全,则中间件将在请求甚至到达视图之前返回403 Forbidden
响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.