【问题标题】:How to get CSRF protection work with pagination?如何通过分页获得 CSRF 保护?
【发布时间】:2017-10-20 06:06:34
【问题描述】:

我想在带有CSRF 保护的搜索表单中启用分页,所以我必须在上一页/下一页的链接中添加csrfmiddlewaretoken GET 参数。

网址如下所示:

localhost:8000/myapp/search/?csrfmiddlewaretoken=JHgf7Cs6WgX29oOsLEpkW1w91ROVTpxXtNAgU1kSA3sDW1aUUOcXmBnxufahqfIS&q=foobar

这是我所做的:

搜索.html

<form method="get" action="">
    {% csrf_token %}
    {{ form|crispy }}

    <button type="submit" class="btn btn-primary btn-block">
        {% trans "Search" %}
    </button>
</form>

......

{% include 'pagination.html' %}

分页.html

<a href="{# csrf_token #}?q={{ query }}&amp;?page={{ page_obj.previous_page_number }}">
    <span aria-label="Previous">&larr;</span>{% trans "Previous" %}
</a>

我应该用什么替换 {# csrf_token #} 以将 CSRF 令牌传递到下一页?

【问题讨论】:

    标签: python django pagination get django-csrf


    【解决方案1】:

    GET 请求不需要 CSRF Authentication。正如link of the official django documentation 中所解释的:

    防御CSRF 攻击的第一道防线是确保GET 请求(以及RFC 7231#section-4.2.1 定义的其他“安全”方法)没有副作用。然后可以按照以下步骤保护通过“不安全”方法(例如 POSTPUTDELETE)发出的请求。

    此外,在 Django 1.11 版本中,添加了CSRF_USE_SESSIONS,您可以按如下方式使用它(taken from the documentation):

    1. 在您的 HTML 中包含 CSRF 标记 ({% csrf_token %})

    2. 使用 JavaScript 从 DOM 中读取令牌:

      {% csrf_token %} 
      <script type="text/javascript">
      // using jQuery
      var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
      </script>
      

    这将使您能够通过会话获得 CSRF 令牌,而无需将其与 url 一起传递。

    祝你好运:)

    【讨论】:

      猜你喜欢
      • 2015-10-31
      • 2016-02-05
      • 2016-12-29
      • 2012-11-26
      • 2017-05-13
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多