django:csrf_token用于单个页面上的多个表单和ajax请求

时间:2015-08-06 21:52:23

标签: jquery ajax django csrf django-csrf

我的网站有一个页面,包含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请求。

问题:

  1. 在其中一个表单中使用csrf_token以及javascript代码(如上所述)是否足以确保csrf伪造?我应该在第二种形式中使用csrf_token吗?
  2. 正如在这篇SO Generating CSRF tokens for multiple forms on a single page中所建议的,似乎使用相同的标记应该没问题。但是,为了清楚起见,我在我的第一个表单中使用{% csrf_token %}而不是帖子中提到的隐藏字段。我没有在我的第二种形式中使用任何csrf_token
  3. 我应该为我的ajax电话做些额外的事情还是他们没事?
  4. 是否可以通过views.py功能检查呼叫csrf是否安全?
  5. 如果您需要更多信息,请告诉我,我将很乐意进一步阐述。

1 个答案:

答案 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响应。