【发布时间】:2015-11-06 01:34:18
【问题描述】:
我开发了一个 Django 文件上传 API,它从客户端接收发布的数据并将数据保存为文件。
根据Django CSRF manual,HTTP 请求标头应设置 X-CSRFToken 为 csrftoken cookie 值。我已经通过下面的代码设置了 X-CSRFToken,但是 POST 请求仍然被 Django 服务器禁止(403),如下图所示。
$(document).ready(function(){
var authid
$.get("http://localhost:8000/v1/getAuthID?username=testuser1&password=123", function(data){
authid = data["authid"];
var csrftoken = $.cookie('csrftoken');
console.log(csrftoken);
$.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
});
url = "http://localhost:8000/v1/file".replace("{authid}", authid).replace("{token}", csrftoken)
$.post(url, function(data){
})
})
})
您是如何通过向 Django 服务器发送 POST 请求来克服 Django CSRF 的?
谢谢!
【问题讨论】:
-
是什么让你如此确定这是一个 CSRF 问题?乍一看,您的 CSRF 处理没有任何问题。
-
我收到“CSRF 验证失败。请求中止。”当我检查 403 响应时。当 X-CSRFToken 添加代码被移除时,我可以得到相同的响应。
-
好的,你能检查一下POST请求中发送的cookie是否与header匹配吗?
-
感谢@knbk 的检查!如果我在浏览器中清除了以前的 cookie,我将永远无法获得名为“csrftoken”的 cookie。
-
似乎 Django 没有向客户端发送 cookie csrftoken
标签: python django csrf django-csrf