Django 中间件使用 ajax 使用 HTTPS POST 引发 403 错误

     2023-02-24     27

关键词:

【中文标题】Django 中间件使用 ajax 使用 HTTPS POST 引发 403 错误【英文标题】:Django middleware throws 403 error with HTTPS POST using ajax 【发布时间】:2012-08-10 07:14:22 【问题描述】:

我对这里的许多部分(Django/Ajax 等)都很陌生,所以虽然我了解高级 CSFR 图片,但我对细节没有完整的掌握。

由于传递的数据量较大,我需要将请求从 GET 转换为 PUT。高级别的,我正在通过 HTTPS 对 django 应用程序进行 AJAX POST API 调用。调用是从提供页面的同一域进行的。

但是,我不断收到“未设置 CSRF cookie”错误。

我正在使用 Django 1.4

为了通过 CSRF 保护,我在标题中包含了其他帖子中提到的 X-CSFRToken,并在发布的数据中包含了 csrf_token 标签。但是,看起来该标签并没有被令牌替换。 X-CSFRToken 值在请求中作为 NULL 发送。不知道为什么它没有设置。

我的印象是我不需要在页面视图中使用 ensure_csrf_cookie(),因为我在 ajaxSetup 中的 POST 之前获取了 cookie,但我也尝试过。

知道我做错了什么?

相关代码:

siteUrl = "https://localhost:8443/"

$.ajaxSetup( 
     beforeSend: function(xhr, settings) 
         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]);
                 if (cookie.substring(0, name.length + 1) == (name + '=')) 
                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                     break;
                 
             
         
         return cookieValue;
         
         if (new RegExp("^"+siteUrl.replace("\\","\\\\")+".*").test(settings.url)) 
             // Only send the token to URLs from our site.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         
      
);


$.ajax(
    url: submitUrl,
    data: 'network_ids': JSON.stringify(network_ids),
            'csrfmiddlewaretoken': ' csrf_token ',
    type: 'POST',
    crossDomain: true,
    dataType: 'json',
    cotentType: 'application/json',
    success: function(mydata) 
        console.log(mydata);
    ,
    error: function(jqXHR, textStatus, errorThrown) alert(textStatus); alert(errorThrown)
)

【问题讨论】:

【参考方案1】:

您有多种选择: 此代码清单显示您从 cookie 中获取 CSRF 令牌:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

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;

getCookie('csrftoken');

并假设 javascript 函数正在提交到 django 视图,您可以告诉该视图忽略 csrf 保护。 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

【讨论】:

【参考方案2】:

你的 js 是通过 Django 的模板引擎提供的吗?否则 csrf_token 将不会被评估。你检查过它实际上是 POST 到服务器的吗?

同样根据docsajaxSend 事件背后的想法是您不必必须显式传递csrf_token

我注意到您的 ajaxSetup 与文档中的略有不同。这可能是正确的,但是我会从文档中复制原件。

【讨论】:

在 django 中间件中使用 HTTP HttpResponsePermanentRedirect 时站点进入重定向循环

】在django中间件中使用HTTPHttpResponsePermanentRedirect时站点进入重定向循环【英文标题】:SiteentersintoRedirectloopwhenusingHTTPHttpResponsePermanentRedirectindjangomiddleware【发布时间】:2014-02-0513:10:59【问题描述】:当我尝试在Heroku上部署时,我... 查看详情

Django - 使用 Ajax 的 POST 方法错误“POST /......./ HTTP/1.1”405 0

】Django-使用Ajax的POST方法错误“POST/......./HTTP/1.1”4050【英文标题】:Django-POSTmethoderror"POST/......./HTTP/1.1"4050withAjax【发布时间】:2019-02-2607:51:57【问题描述】:我使用POST方法,因为我需要更改数据库。但是每次使用POST的... 查看详情

使用 AJAX 设置时未保存 Django 会话变量

】使用AJAX设置时未保存Django会话变量【英文标题】:DjangosessionvariablenotbeingsavedwhensetusingAJAX【发布时间】:2017-01-0216:29:13【问题描述】:我正在为我的项目使用数据库支持的会话。我正在尝试使用AngularJS通过AJAX发布请求更新会... 查看详情

在 django 中使用 ajax 时无法发布

】在django中使用ajax时无法发布【英文标题】:can\'tpostwhenusingajaxindjango【发布时间】:2012-07-3122:07:37【问题描述】:所以我一直在关注本教程http://webcloud.se/log/AJAX-in-Django-with-jQuery/,get方法工作正常。即我得到一个弹出窗口,说... 查看详情

如何在 Django 中使用 AJAX 显示 rest api?

】如何在Django中使用AJAX显示restapi?【英文标题】:HowtodisplayrestapiusingAJAXinDjango?【发布时间】:2021-12-2706:39:44【问题描述】:我希望能够使用下面的RESTAPI并在单个HTML页面上显示数据。这是来自我的Djangoproject中的数据库连接函数... 查看详情

Django + ajax(jquery):http错误代码403(禁止)[关闭]

】Django+ajax(jquery):http错误代码403(禁止)[关闭]【英文标题】:Django+ajax(jquery):httperrorcode403(forbidden)[closed]【发布时间】:2011-12-1407:16:57【问题描述】:我正在页面中使用jquery开发一个简单的ajax调用($.ajax函数,类型、url和... 查看详情

django中间件的使用(代码片段)

Django中间件的使用中间件(middleware)中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应可以通过中间件,也就是说中间件可以处理request和r... 查看详情

django中间件(勾子函数)使用(代码片段)

中间件    Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们... 查看详情

django中间件的使用??(代码片段)

 django中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。在django项目的settings模块中,有一个MIDDLEWARE_CLASSES变量,其中每一个元... 查看详情

在不使用 Django 本身的情况下测试自定义 Django 中间件

】在不使用Django本身的情况下测试自定义Django中间件【英文标题】:TestingcustomDjangomiddlewarewithoutusingDjangoitself【发布时间】:2017-08-1610:48:28【问题描述】:我在1.10style中编写了我的自定义Django中间件,类似于:classMyMiddleware(object)... 查看详情

使用 AJAX 获取 Django 视图数据

】使用AJAX获取Django视图数据【英文标题】:FetchDjangoviewdatawithAJAX【发布时间】:2018-10-0622:04:51【问题描述】:目前我正在构建一个通过AJAX更新主页数据的应用程序。基于this问题,我使用(参见下面的代码/1/)ajax来刷新我的页... 查看详情

django

...Django与Ajax,分页器组件,forms组件,cookie与session组件,中间件组件,Auth模块,ContentType组件RestFramework:RESTful规范 &nbs 查看详情

Django ajax——当我使用 Ajax、Django 发送表单时为空 request.FILE

】Djangoajax——当我使用Ajax、Django发送表单时为空request.FILE【英文标题】:Djangoajax--Emptyrequest.FILEwhenIamsendingaformwithAjax,Django【发布时间】:2013-09-2417:44:27【问题描述】:我正在使用Django1.5.2、jQueryv1.9.0和POSTGRESQL9.1。我正在使用ajax... 查看详情

使用 ajax 和 django 传递信息

】使用ajax和django传递信息【英文标题】:useofajaxwithdjangoforpassinginformation【发布时间】:2016-03-0806:03:52【问题描述】:我正在尝试通过django视图测试ajax的使用。我是ajax和django的新手。我创建了一个3*3按钮单元格的网格。当我单... 查看详情

Django Channels 中间件使用 ORM

】DjangoChannels中间件使用ORM【英文标题】:DjangoChannelsmiddlewareuseORM【发布时间】:2020-09-0822:38:18【问题描述】:我在检查中间件内部的用户令牌时遇到了麻烦。我从cookie中获取令牌,然后我需要查询数据库以检查此令牌是否存在... 查看详情

如何在 Django 中使用 jQuery/Ajax 发布?

】如何在Django中使用jQuery/Ajax发布?【英文标题】:HowdoIPOSTwithjQuery/AjaxinDjango?【发布时间】:2012-11-0801:52:14【问题描述】:我正在尝试在Django中使用jQuery/AJAX发布数据,但遇到了麻烦。当我运行下面的代码并单击“测试”按钮时... 查看详情

django框架基础-django的认证系统-长期维护-20200114

##################  为什么使用中间件?   ####################### ##################  为什么使用中间件?   ####################### ##################  为什么使用中间件?   #################... 查看详情

如何正确使用 AJAX 和 DJANGO?

】如何正确使用AJAX和DJANGO?【英文标题】:HowtousetheAJAXwithDJANGOappropriately?【发布时间】:2021-04-1921:50:12【问题描述】:我是web开发的新手,我知道如何将AJAX与DJANGO一起使用,但我想知道哪种方法是最好的我在我的html文件中使用... 查看详情