📅  最后修改于: 2023-12-03 15:27:40.252000             🧑  作者: Mango
在使用 jQuery 的 Ajax 方法提交表单时,如何在表单中添加 CSRF 令牌来防止跨站请求伪造(CSRF)攻击?
在表单中添加一个隐藏的 input 元素,用于保存 CSRF 令牌。可以使用 Django 自带的 csrf_token 模板标签来生成 CSRF 令牌,并把生成的令牌插入到 input 元素中
<form action="/your/url/" method="POST">
{% csrf_token %}
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<input type="submit" value="Submit">
</form>
在 jQuery Ajax 方法中设置 beforeSend 回调函数,在该函数中获取 CSRF 令牌的值,并添加到请求的 headers 中。
$.ajax({
url: '/your/url/',
type: 'POST',
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", $("input[name='csrfmiddlewaretoken']").val()); // 从表单中获取 CSRF 令牌的值
},
success: function(response) {
// 处理响应
},
error: function(xhr, status, error) {
// 处理错误
}
});
在使用 CSRF 令牌时,需要在服务器端进行验证,否则令牌将失去作用。
CSRF 令牌应该是随机生成的字符串,可以使用 Django 自带的库 django.utils.crypto.get_random_string()
来生成。
如果在提交表单时出现 CSRF 令牌错误(403 Forbidden),可能是因为没有添加正确的 CSRF 令牌,或者令牌已经过期。在开发环境中一般可以通过在 settings.py 文件中添加以下代码来禁用 CSRF 保护:
CSRF_COOKIE_SECURE = False
SESSION_COOKIE_SECURE = False