繁体   English   中英

django:csrf_token在单个页面上包含多种形式和ajax请求

[英]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请求而没有任何问题。

问题:

  1. 在其中一种形式中使用csrf_token和javascript代码(如上所述)是否足以确保csrf伪造? 我应该以第二种形式使用csrf_token吗?
  2. 正如在此SO post中建议的那样,在单个页面上为多个表单生成CSRF令牌似乎使用相同的令牌应该没问题。 但是,为了清楚{% csrf_token %} ,我在第一种形式中使用{% csrf_token %} ,而不是帖子中提到的隐藏字段。 我在第二种形式中没有使用任何csrf_token
  3. 我应该为ajax通话做些额外的事情还是可以吗?
  4. 有没有一种方法可以检查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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM