因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送http请求

浏览器的同源策略(SOP/same origin policy)是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS(跨站脚本攻击 cross site scripting)和CSRF(跨站请求伪造cross-site request forgery)等攻击。

(同源 origin:协议,域名,端口号,不清楚的话,直接在浏览器控制台中输入window.location.origin看看返回值就知道了。)

下面两种情况,是不受跨域限制的,严格来讲,这两种情况只是跨站资源请求:

1)页面中的链接,重定向及表单提交是不受同源策略限制的

2)跨域资源的引入

从上面的第二种情况,我们可以发现,但凡通过src去获取非同源状态的资源时,都是不受跨域限制的,那我们就可以想想,是否可以借助这种跨站资源请求的方式来实现http跨域请求呢?这就是我们接下来要说的第一种跨域解决方案:jsonp

1、JSONP(不仅限于python,所有的GET请求都可以使用jsonp实现跨域)

1)实现原理:

从上面的分析我们已经知道,web页面上请求跨站资源请求是不会受到同源策略限制的,所有我们会想,我们可不可以在服务器上想办法把web端需要的数据装进一个js文件里面,然后让web端直接访问这个js文件,从而获取需要的数据呢?恰巧我们知道有一种叫做json的数据格式,且js原生支持,所以web端就可以通过像访问js脚本一样的方式,来调用跨域服务器上动态生成的js文件。

为了便于客户端使用数据,逐渐形成一种非正式传输协议:JSONP。JSONP的一个要点就是,传给服务器一个callback参数,然后服务器返回数据时,将这个callback参数作为函数名来包裹住json数据

2)jsonp实例

在远程服务器上新建一个remote.js文件:

HandleRemote({"title":"哈哈", "name":"我是一个测试数据哦!"})

在本地新建html文件:

function HandleRemote(data){

console.log(data.title+data.name);

}

运行本地文件,在浏览器的控制台可以看到 哈哈我是一个测试数据哦! 的输出

到现在我们已经实现了去服务器上获取数据,剩下还有两个问题需要我们思考:

a、我们如何让远程服务器知道他要调用的本地函数回调函数的名字是什么?

b、我们如何在远程服务器上动态生成js脚本

有了思路就很好办了,先看第一个问题:

我们如何让服务器知道我们本地的回调函数名?告诉他就行了啊,在请求中加上我们的函数名,然后让远程服务器根据我们的参数取动态生成js脚本调用函数名即可!

前端实现

var url = "http://test.com/getRemoteDate?callback=HandleRemote"

var script = document.createElement("script");

script.setAttribute("src", url)

document.getElementByTagName("head")[0].appendChild(script);

最后将上面的代码封装成通用的ajax形式:

url = "http://test.com/getRemoteDate/";

$.ajax({

url:url,

type:"GET",

dataType:"JSONP",

jsonp:"callback", #将会作为参数传给服务器,用于获得回调函数的参数名

jsonCallback:"test", # 自定义的jsonp的回调函数参数名,默认为jQuery自动生成的函数名,也可以自定义,jQuery会自动为你处理的。

success:function(data){

此处data即为返回的json数据了,前端根据需要自行处理

}

});

服务端代码 :

def getData():

return {"title":"哈哈", "name":"这又是一个测试数据哦!"}

def getRemote(request):

funcName = request.GET.get("callback")

result = getData()

# 将结果以json形式返回,与前端的jsonp交互

return funcName+"("+json.dumps(result)+")"

配置url:

url(r"^getRemoteData/$", getRemote)

到这里,jsonp就完成了,虽然jsonp不受同源策略的限制,但是jsonp有个问题,就是它只支持GET请求,其他请求不支持。

2、在响应头加上响应的允许跨域的参数,告诉浏览器当前请求被服务器接受,这种跨域方式也是通用的。

3、python Django中最常用的另一种处理跨域的方式:

使用Django提供的 Django-cors-headers 来处理跨域

从GitHub上面下载Django-cors-headers

pip install Django-cors-headers.zip

在settings.py中的中间件中配置 【'corsheaders.middleware.CorsMiddleware',】记得这个中间件一定要写在CSRF之前,为了方便处理,一般写在最前面

设置 CORS_ORIGIN_ALLOW_ALL = True,即允许所有的跨域请求,当然,这里也可以设置为False,然后配合 CORS_ORIGIN_WHITELIST 白名单来使用

如此,我们的跨域处理即完成,支持所有的请求。

补充知识:python WSGI 解决跨域问题

import json

from wsgiref.simple_server import make_server

# application()函数是Python中符合WSGI标准的一个HTTP处理函数,返回是一个字符串

def application(environ, start_response):

# start_response 如下调用就会发送HTTP响应的Header,注意只能调用一次start_response()函数发送Header。

# start_response 函数两个参数,一是HTTP响应码,一是一组list表示的HTTP Header,每个Header用一个包含两个str的数组表示

status = '200 OK'

# response_headers 中添加请求头部 ,解决跨域问题

response_headers = [('Content-type', 'application/json'),

('Access-Control-Allow-Origin', '*'),

('Access-Control-Allow-Methods', 'POST'),

('Access-Control-Allow-Headers', 'x-requested-with,content-type'),

] # json

start_response(status, response_headers)

result = {'code': 200, 'message': "You get the flag"}

return [result.encode()]

if __name__ == "__main__":

port = 8091

httpd = make_server("127.0.0.1", port, application)

print("serving http on port {0}...".format(str(port)))

httpd.serve_forever()

以上这篇关于python 跨域处理方式详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持python博客。

python跨域攻击教学_关于python 跨域处理方式详解相关推荐

  1. python实现局域网攻击软件_使用python的scapy库进行局域网内的断网攻击(基于ARP协议)...

    (使用python scapy库进行网络攻击) ARP协议 ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的进行. ARP攻击的局限性: ARP攻击仅能在以太网( ...

  2. 微信小程序python解析获取用户手机号_微信小程序获取用户手机号详解

    最近在做一款微信小程序,需要获取用户手机号,具体步骤如下: 流程图: 1.首先,客户端调用wx.login,回调数据了包含jscode,用于获取openid(用户唯一标识)和sessionkey(会话 ...

  3. python中define的用法_#define用法,C语言#define详解

    C语言中,可以用 #define 定义一个标识符来表示一个常量.其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了. 预编译又叫预处理.预编译不是编译,而是编译前的处理.这 ...

  4. python selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)

    引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待了,等待元素可见再继续运行程序: 注:当使用该放发的时 ...

  5. python的等待代码是什么_Python selenium 三种等待方式详解

    1.目的背景 解决问题:下拉框定位不到.弹框定位不到-各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待. 原因:代码运行速度快,而浏览器加载渲染速度慢 解决办法:加等待,目 ...

  6. dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

    创建DataFrame的几种方式 1.读取json格式的文件创建DataFrame 注意: 1. json文件中的json数据不能嵌套json格式数据. 2. DataFrame是一个一个Row类型的 ...

  7. rust如何在木板上上传图片_腐蚀rust游戏玩法方式详解

    在腐蚀这款游戏中玩家所有的物资都需要自己去寻找,不过很多时候遇到不怀好意的玩家时最好提高安全意识,及时躲避袭击,下面是游戏玩法发展方式详解. 游戏玩法方式详解 这里分两种发展方式 1.纯新手 首先需要 ...

  8. oracle mysql连接池配置文件_数据库连接池两种配置方式详解

    数据库连接池: 负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接 ...

  9. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

最新文章

  1. 11月3号晚7点中科院南土所梁玉婷报告:土壤微生物功能组学与关键类群识别
  2. 迁移学习,让深度学习不再困难……
  3. vue.js组件学习(上)
  4. Linux多线程同步的几种方式
  5. 开机先看广告!智能电视这流氓操作被整治,这家厂商败诉
  6. 【ECharts 置图表同序列不同数据点的独立颜色值】
  7. 安装oracle需注意的地方
  8. Redis 安装部署介绍
  9. python对城市规划_城市规划哪些环节可以可以用数据完美解决?
  10. linux系统管理考试试题及答案,《Linux系统管理》期末综合试题答案.doc
  11. 微信小程序 选项卡 swiper默认高度150px(让高度实现自适应)解决方法
  12. 搜狗微信文章采集php,搜狗微信采集 —— python爬虫系列一
  13. Python基础-名片管理
  14. 解决企业繁杂表单问题,还得看天翎表单引擎
  15. 四六级成绩还可以这样查?Python助你装B一步到位!!!
  16. TortoiseSVN环境搭建以及局域网服务器
  17. css动画-3d旋转盒子
  18. Errors during downloading metadata for repository ‘AppStream‘: - Status code: 404 for http://mirro
  19. Android安全性优化——APP加固
  20. 微信小程序直传腾讯云COS并对图片持久化文字水印案例

热门文章

  1. java单个变量的表达式_java中使用Lambda表达式的5种语法
  2. mysql注解批量添加mybatis_Mybatis注解方式 实现批量插入数据库
  3. 【爬虫剑谱】二卷7章 实战篇-搭建IP代理池绕过反爬检测
  4. Oracle触发器3-DDL触发器
  5. android通知背景色,android – 更改通知RemoteViews背景颜色
  6. decimal(10,2) 的含义
  7. 蒙哥马利java算法_算法详解 - 蒙哥马利算法的概念与原理
  8. mysql 大表 驱动_MySql 小表驱动大表
  9. numpy随机生成01矩阵_Python数据分析Numpy库常用函数详解,提到循环就该想到的库...
  10. dom4j添加节点的父节点_HTML DOM节点介绍