当先锋百科网

首页 1 2 3 4 5 6 7

一 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