外观
Django 跨域解决方案CORS
跨域
浏览器的同源策略
同源策略是浏览器对我们上网行为的一种保护。跨域问题是由浏览器的同源策略引起的,在后端编程语言的Http Client调用中不会存在。同源策略中的同源是说站点的协议、域名、端口都需要相同。
看到关键字CORS
、Access-Control-Allow-Origin
可以判断基本上就是跨域相关的错误了。
跨域资源共享(CORS)
CORS(Cross-origin resource sharing,跨域资源共享)是一个 W3C 标准,定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通。它的核心思想,使用自定义的HTTP头部信息让浏览器和后端进行沟通,来决定是否允许跨域请求。
CORS 方式解决跨域,主要需要后端支持,主流浏览器均已支持。站点在访问跨域资源的时候,浏览器会自动的添加HTTP头信息,自动完成与后端的沟通,用户无感知。
CORS的工作方式:
- 服务器通过设置HTTP响应头部字段
Access-Control-Allow-Origin
来指定哪些域可以访问资源。 - 浏览器根据这个头部信息决定是否阻止请求。
CORS策略可以细粒度地控制跨源请求,例如通过Access-Control-Allow-Methods
和Access-Control-Allow-Headers
来指定允许的HTTP方法和头部。
跨站请求伪造(CSRF)
CSRF(Cross-site request forgery)是一种攻击方式,它利用了用户已认证的身份,在用户不知情的情况下,诱使用户的浏览器向某个Web应用发起一个非本意的请求。简单来说,攻击者利用受害者的身份执行了某些操作,而这些操作受害者并不知情。
例如:
- 用户登录了银行网站后,没有登出。
- 用户在访问攻击者控制的网站时,该网站通过一些手段(如图片标签的src属性)向银行网站发起了一个转账的操作。
- 银行网站收到请求后,因为用户处于登录状态,会认为这是一个合法的操作,从而执行转账。
防御CSRF的措施通常包括:
- 使用CSRF Token:服务器生成一个随机Token,在用户的每个请求中都需要携带这个Token,以确保请求是用户正常发起的。
- 检查Referer字段:服务器验证请求的来源是否合法。
- 双重Cookie提交:要求在请求时不仅发送Cookie,还要在请求体中包含Cookie的值。
Django跨域解决方案
安装django-cors-headers
sh
pip install django-cors-headers
# 或
pip install django-cors-headers -i https://mirrors.aliyun.com/pypi/simple --trusted-
host=mirrors.aliyun.com
配置
配置文件 settings.py
python
INSTALLED_APPS = [
...,
"corsheaders",
...,
]
MIDDLEWARE = [
#注意:放在第一个
"corsheaders.middleware.CorsMiddleware", # CORS跨域支持
#注释下面这个(可选)
# 'django.middleware.csrf.CsrfViewMiddleware',
...,
]
# 允许全部IP访问
ALLOWED_HOSTS = ['*']
### CORS 跨域配置
#方式一:全局放开
from corsheaders.defaults import default_headers
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True # 允许所有源
CORS_ALLOW_HEADERS = list(default_headers) + [
# 放行自定义请求头
"Cache-Control",
"Pragma",
"tenant-id",
]
#方式二:填写可跨域访问的域名/IP
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://127.0.0.1:8080",
# 其它按需填写
]