我想在具有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 }}&?page={{ page_obj.previous_page_number }}">
<span aria-label="Previous">←</span>{% trans "Previous" %}
</a>
如何将{# csrf_token #}
替换为将CSRF令牌传递到下一页?
答案 0 :(得分:1)
CSRF Authentication
请求您不应该GET
。正如本link of the official django documentation中所述:
针对
CSRF
攻击的第一道防线是确保GET
请求(以及RFC 7231#section-4.2.1定义的其他'安全'方法)无副作用。然后,可以通过以下步骤保护通过“不安全”方法的请求,例如POST
,PUT
和DELETE
。
此外,在Django 1.11版中,添加了CSRF_USE_SESSIONS
,您可以按照以下方式使用taken from the documentation):
CSRF
){% csrf_token %}
令牌
使用JavaScript从DOM中读取令牌:
{% csrf_token %}
<script type="text/javascript">
// using jQuery
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
</script>
这将使您能够通过会话获得CSRF令牌,而无需使用URL传递它。
祝你好运:)