Django csrf ajax仅在生产中失败
据我所知,我已经把一切都安排好了,并且在开发过程中发挥了作用: 我包含了以下代码:Django csrf ajax仅在生产中失败,ajax,django,csrf,Ajax,Django,Csrf,据我所知,我已经把一切都安排好了,并且在开发过程中发挥了作用: 我包含了以下代码: function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.leng
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
函数getCookie(名称){
var-cookieValue=null;
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i这在开发中有效而在生产中无效的原因可能是什么?一个可能的原因可能是您的生产设置中有CSRF\u COOKIE\u SECURE=True。这将仅使用HTTPS连接发送cookie。如果您已启用此功能,但希望视图在不使用CSRF令牌的情况下处理POST请求,请使用装饰视图 编辑:还要检查会话\u COOKIE\u安全是否已启用。如果设置为True,则可能会遇到此问题 我遇到了一个类似的问题,通过将登录用户(Django管理员页面)的URL移动到仅通过HTTPS提供服务,从而消除了后一种设置的需要,从而解决了这个问题。我仍然保留CSRF_COOKIE_SECURE=True,以及处理POST请求(set_语言)所需的单个URL,并使用@CSRF_export包装,以便它可以绕过此设置。这意味着任何需要处理匿名会话表单的视图也需要进行类似的修饰
目前看来一切正常,但我仍在研究我的配置是否还有其他安全隐患。另外,可能有更好的方法来处理这个问题。在那之前,我可以接受这种方法。HTH.在我的情况下,以下解决了问题:
@ensure_csrf_cookie
def your_view(request)
根据文档,如果没有包含{%csrf_token%}的表单,则可能不会设置csrf cookie
您是否确认该代码确实包含在生产中?你能在开发工具中看到它吗?在部署静态文件后,我很多次忘记运行
collectstatic
。是的,它肯定包括在内。我刚刚在控制台中键入了getCookie('csrftoken')
,它返回了null
这是怎么回事?当你说它失败时,你得到的确切失败是什么?呼叫未触发,从服务器返回错误,等等?当您未发送csrftokenCSRF验证失败时,我会收到您收到的消息。请求被中止。
我刚刚在控制台中键入了document.cookie.indexOf('csrftoken')
,它返回了-1
,因此由于某种原因cookie不存在,这是什么原因造成的?使用浏览器的开发工具或curl-I
仔细检查cookie是否正在发送。例如,如果JavaScript无法读取cookie,并且它不会出现在文档中。cookie
。在我的答案周围找到另一条线索,