一 XSS
二 CSRF
跨站请求伪造(CSRF)是一种冒充受信任用户,向服务器发送非预期请求的攻击方式。
三 CORS
CORS (Cross-Origin Resource Sharing,跨域资源共享)是一个系统,它由一系列传输的HTTP 头组成,这些 HTTP 头决定浏览器是否阻止前端 JavaScript 代码获取跨域请求的响应。
3.1 为什么会出现跨域问题?
同源安全策略 默认阻止“跨域”获取资源。但是 CORS 给了 web 服务器这样的权限,即服务器可以选择,允许跨域请求访问到它们的资源。
浏览器的同源策略: 是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。
同源的定义: 如果两个 URL 的 协议、端口 (如果有指定的话) 和 主机都相同的话,则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”,或者直接是“元组”。(“元组”是指一组项目构成的整体,双重/三重/四重/五重/等的通用形式)。
下表给出了与 URL http://store.company.com/dir/page.html 的源进行对比的示例:
请求是跨域的,并不一定会报错。普通的图片请求,css文件请求是不会报错的
跨域请求出现错误的条件: 浏览器同源策略 && 请求是ajax类型
浏览器将CORS请求分成两类:
- 简单请求(simple request)
- 非简单请求(not-so-simple request)
满足下面两种情况,就是简单请求:
请求方法是以下三种方法之一:
HEAD
GET
POST
HTTP的请求头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
3.2 跨域问题解决方案
在django中:
方式一:在响应对象的响应头中添加一堆键值对,key为Access-Control-Allow-Origin,value为*,这样就是允许所有域名访问。
def get_data(request):
res = JsonResponse({'name': 'xuxiaoxu', 'age': 18})
# 解决简单请求
res['Access-Control-Allow-Origin'] = '*'
# 解决非简单请求
if request.method == 'OPTIONS':
res['Access-Control-Allow-Headers'] = 'Content-Type'
return res
方式二:安装django-cors-headers模块
pip3 install django-cors-headers
注册app
INSTALLED_APPS = [
...
'corsheaders'
]
添加中间件,加在第一个。
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
settings.py中加一行配置
# 注册app
INSTALLED_APPS = [
...
'corsheaders',
]
# 添加中间件
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
]
# 允许跨域源
CORS_ORIGIN_ALLOW_ALL = True
# 允许的请求头
CORS_ALLOW_HEADERS = (
"accept",
"accept-encoding",
"authorization",
"content-type",
"dnt",
"origin",
"user-agent",
"x-csrftoken",
"x-requested-with",
# 额外允许的请求头
'token',
)
flask中也可以在响应对象的响应头中加上 Access-Control-Allow-Origin = ‘*’
@app.route('/')
def get_data():
res = jsonify({'name': 'xuxiaoxu', 'age': 18})
# 解决跨域问题
res['Access-Control-Allow-Origin'] = '*'
return res