Skip to content

Django 跨域解决方案CORS

跨域

浏览器的同源策略

同源策略是浏览器对我们上网行为的一种保护。跨域问题是由浏览器的同源策略引起的,在后端编程语言的Http Client调用中不会存在。同源策略中的同源是说站点的协议域名端口都需要相同。

看到关键字CORSAccess-Control-Allow-Origin 可以判断基本上就是跨域相关的错误了。

跨域资源共享(CORS)

CORS(Cross-origin resource sharing,跨域资源共享)是一个 W3C 标准,定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通。它的核心思想,使用自定义的HTTP头部信息让浏览器和后端进行沟通,来决定是否允许跨域请求。

CORS 方式解决跨域,主要需要后端支持,主流浏览器均已支持。站点在访问跨域资源的时候,浏览器会自动的添加HTTP头信息,自动完成与后端的沟通,用户无感知。

CORS的工作方式:

  • 服务器通过设置HTTP响应头部字段Access-Control-Allow-Origin来指定哪些域可以访问资源。
  • 浏览器根据这个头部信息决定是否阻止请求。

CORS策略可以细粒度地控制跨源请求,例如通过Access-Control-Allow-MethodsAccess-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",
    # 其它按需填写
]

点击查看完成代码

参考资料: