Django跨域请求CSRF的方法示例

web跨域请求

  1.为什么要有跨域限制

  举个例子:

    1.用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识。
    2.用户浏览了恶意页面 http://evil.com。执行了页面中的恶意AJAX请求代码。
    3.http://evil.com向http://mybank.com发起AJAX HTTP请求,请求会默认把http://mybank.com对应cookie也同时发送过去。
    4.银行页面从发送的cookie中提取用户标识,验证用户无误,response中返回请求数据。此时数据就泄露了。
    5.而且由于Ajax在后台执行,用户无法感知这一过程。

  以上就是所谓是CSRF(Cross-site request forgery)攻击,跨站请求伪造。接下来说一下 Django中处理csrf的方式

  正常情况下直接发起一个psot请求,会报错。错误的意思是csrf校验失败,request请求被丢弃掉。

  那么在django中的post失败有两种解决办法:

  解决办法一:将csrf中间层注释掉


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

MIDDLEWARE = [

 

  ‘django.middleware.security.SecurityMiddleware‘,

 

  ‘django.contrib.sessions.middleware.SessionMiddleware‘,

 

  ‘django.middleware.common.CommonMiddleware‘,

 

#  ‘django.middleware.csrf.CsrfViewMiddleware‘,

 

  ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,

 

  ‘django.contrib.messages.middleware.MessageMiddleware‘,

 

  ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,

 

]

  此时将不会进行csrf的校验,但如前面所述,这是一种不安全的行为。而且djano也不推荐使用

  解决办法二:

  在前面的提示中有这样一句话:


1

<form action="" method="post">{% csrf_token %}

  也就是说在网页中加入csrf_token的标签就可以通过csrf校验

Django 提供的 CSRF 防护机制:

  1、django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。

  2、在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token,在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)

  3、在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.

  4、在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

原文地址:https://www.cnblogs.com/wdbgqq/p/10029082.html

时间: 2024-11-05 17:33:28

Django跨域请求CSRF的方法示例的相关文章

什么是跨域?跨域请求资源的方法有哪些?

1.什么是跨域? 由于浏览器同源策略,凡是发送请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域.存在跨域的情况: 网络协议不同,如http协议访问https协议. 端口不同,如80端口访问8080端口. 域名不同,如qianduanblog.com访问baidu.com. 子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com. 域名和域名对应ip,如www.a.com访问20.205.28.90. 2.跨域请求资源的方法: (1)

Nginx服务器中处理AJAX跨域请求的配置方法讲解

Nginx 实现AJAX跨域请求AJAX从一个域请求另一个域会有跨域的问题.那么如何在nginx上实现ajax跨域请求呢?要在nginx上启用跨域请求,需要添加add_header Access-Control*指令.如下所示: ? 1 2 3 4 5 6 7 8 9 10 11 12 location /{ add_header 'Access-Control-Allow-Origin' 'http://other.subdomain.com'; add_header 'Access-Cont

jQuery ajax跨域请求的解决方法

在Ajax应用中,jQuery的Ajax请求是非常容易而且方便的,但是初学者经常会犯一个错误,那就是Ajax请求的url不是本地或者同一个服务器下面的URI,最后导致虽然请求200,但是不会返回任何数据,事实上简单来说请求同一个域名下的url或者说用不带http的绝对路径和相对路径请求是没有任何问题的,如果请求外部资源,那么这就称为跨域请求. 由于安全性的问题,浏览器默认不支持跨域调用,晚上也有很多方法,各有优缺点,但是有一个比较好的解决方法这也是jQuery1.2之后官方推荐的,那就是在客户端

ajax本地跨域请求以及解决方法

什么是跨域? ??我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场景.所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源,只要没有同时满足这三个条件的请求即为跨域请求,跨域请求控制台一般会出现类似错误: XMLHttpRequest cannot load http://xxxxx.php. No 'Access-Control-Allow-Origin' header is present on the requested reso

XMLHttpRequest(ajax)跨域请求的优雅方法:CORS

浏览器的同源原则,使得 XMLHttpRequest 不能跨域通讯.为了实现跨域,有很多变态的做法.其中,比较优雅的是 JSONP 方案,但 JSONP 仅限于 GET 方法,其它方法无法实现. W3C在2009年的时候就出过一个标准,只要在响应头部使用 Access-Control-Allow-Origin 即可实现跨域通讯,例如: HTTP/1.1 200 OK Access-Control-Allow-Origin: * 当然,如果想要兼容古老的 IE8,还得找 JSONP 方案,或者去实

aspnet mvc 中 跨域请求的处理方法

ASP.NET 处理跨域的两种方式    方式1,后端程序处理.原理:给响应头加上允许的域即可,*表示允许所有的域                 定义一个cors的过滤器 加在在action或者controller上面即可 具体代码: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.All, Inherited = true, AllowMultiple = true)] p

Django 跨域请求 解决 axios 未完待续

import django import os # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled5.settings") # project_name 项目名称 # django.setup() from django.utils.deprecation import MiddlewareMixin import importlib project_settings = os.environ['D

Flask实现跨域请求的处理方法

https://blog.csdn.net/wangshu_liang/article/details/86490137 https://blog.csdn.net/a1241314660/article/details/77995654 https://www.cnblogs.com/cwp-bg/p/9256892.html https://www.jianshu.com/p/26b561a10bec https://blog.csdn.net/dreamcatcher1314/articl

js跨域请求数据的3种常用的方法

由于js同源策略的影响,当在某一域名下请求其他域名,或者同一域名,不同端口下的url时,就会变成不被允许的跨域请求.那这个时候通常怎么解决呢,对此菜鸟光头我稍作了整理:1.JavaScript   在原生js(没有jQuery和ajax支持)的情况下,通常客户端代码是这样的(我假设是在localhost:8080的端口下的http://localhost:8080/webs/i.mediapower.mobi/wutao/index.html页面的body标签下面加入以下代码): <script