我正在localhost上开发一个小型应用程序,并使用flask-seasurf来防止csrf攻击。我所有的非ajax表单均可与flask-seasurf一起正常使用。我有一种表单在表单提交时触发对'/ checkajax'的ajax调用;这一直有效,直到我开始使用flask-seasurf,但现在出现控制台错误,而ajax不起作用:
Warning in flask_seasurf: Forbidden (CSRF token missing or incorrect): /checkajax
触发ajax调用的表单具有标准的隐藏字段,其中包含嵌入在jinja页面模板中的flask-seasurf的'csrf_token()'函数调用:
<input id="csrf-token" type="hidden" name="_csrf_token" value="{{ csrf_token() }}">
ajax调用结构是:
$("#submit").submit(function(event) {
event.preventDefault();
$.ajax({
url: "/checkajax",
data: {...},
type: "POST",
datatype: "text",
success: function(response){
...
},
error: function(response) {
...
}
});
});
我从站点cookie中看到,有flask-seasurf生成的'_csrf_token'条目。任何人都可以就为何此ajax调用现在无法正常工作提供一些见解吗?
我的问题的解决方案是修改ajax调用的标头,以包括定义为flask-seasurf令牌的X-CSRFToken:
var csrf_token = $("csrf-token").val()
$("#submit").submit(function(event) {
event.preventDefault();
$.ajax({
headers: {"X-CSRFToken", csrf_token},
url: "/checkajax",
data: {...},
type: "POST",
datatype: "text",
success: function(response){
...
},
error: function(response) {
...
}
});
});
希望对别人有帮助。