python前后端跨域请求问题
一、 Access-Control-Allow-Origin
方法1:使用 response.setHeader(“Access-Control-Allow-Origin”,"*"); 可以解决
目前的浏览器为了数据的安全,所有请求被严格限制在同一域名下,如果需要从不同的服务器(不同域名)上获取数据,那么需要使用跨域HTTP请求。
实现跨域的方式是在请求的目标网站后台中(以java servlet为例)添加如下代码:
response.setHeader("Access-Control-Allow-Origin","*"); //允许所有域名访问
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
response.setHeader("Access-Control-Allow-Credentials", "true");
方法2:添加端口转发技术
在vue项目目录中,在webpack.base.config.js文件下*,写入
module.exports ={
devServer:{
proxy: {
'/api/':{
target: 'http://127.0.0.1:8080/',
pathRewrite: {'^/api/': '/'},
changeOrigin: true
},
}
}
}
}
二、
d
j
a
n
g
o
C
S
R
F
p
r
o
t
e
c
t
(
防
止
出
现
F
o
r
b
i
d
d
e
n
403
)
\color{red}{django CSRF protect (防止出现Forbidden 403)}
djangoCSRFprotect(防止出现Forbidden403)
方法1:view,py方法上加装饰器 @csrf_exempt
方法2: 在html页面上直接写入csrf,
方法3: 去掉django的中间件CsrfViewMiddleware,settings里配置
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
CSRF
CSRF是跨站点请求伪造,简单来说就是用户在访问受信任网站后,浏览器记录了受信任网站的cookie,此时用户在不登出受信任网站的同时访问了危险网站,危险网站的请求和cookie一起到达服务器,服务器Session未过期的时候,就误认为该请求是用户发出的,从而被危险网站利用。目前解决CSRF攻击的方法,常用的方法就是进一步确认一个请求是来自于用户还是危险网站,就是客户端发送请求时,增加伪随机数,常用的方法有3种:
(1)验证码
(2)客户端登陆后发送token给服务器,且客户端每一次请求都带上这个token,服务器记录第一次登陆后的token,并对每一次请求进行验证
(3)在HTTP头中自定义属性并验证
Django的CSRF保护机制
HTTP请求,分为两类:“安全请求”和“不安全请求”。GET是“安全请求”, POST, PUT, DELETE是“不安全请求”。安不安全,主要还是看请求设计者。比如,如果银行系统的转账设计是用GET进行的,那GET也是不安全的。所以一般GET就用于获取资源,不要进行资源更新操作,资源更新交给POST来做。
对于“不安全请求”,Django设计了CSRF验证,简单来说这个机制是这样的:
(1) 客户端访问Django站点,Django服务器向客户端发送名为”csrftoken”的cookie
(2) 客户端对Django服务器发送不安全请求时,必须在HTTP头部加入”X-CSRFToken”字段,并将这个cookie的值作为该字段的值
(3) Django服务器端会对HTTP头部X-CSRFToken的值进行验证,依次来判断这个请求是不是来自合法用户