如何通过分页获得CSRF保护?

时间:2017-05-20 02:43:45

标签: python django pagination get django-csrf

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

网址如下:

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

以下是我所做的:

  

search.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' %}
  

pagination.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令牌传递到下一页?

1 个答案:

答案 0 :(得分:1)

CSRF Authentication请求您不应该GET。正如本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
  2. 中加入{% csrf_token %}令牌
  3. 使用JavaScript从DOM中读取令牌:

    {% csrf_token %} 
    <script type="text/javascript">
    // using jQuery
    var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
    </script>
    
  4. 这将使您能够通过会话获得CSRF令牌,而无需使用URL传递它。

    祝你好运:)