django restframework 跨域访问
场景介绍:
在Django开发过程中,使用前后端分离设计的站点越来越多,如Django+VUE、Django+Angular。在使用DjangoRestFramework开发API的过程中,由于前端站点和后端API站点域名往往不同,随之而来的便是跨域问题。
跨域攻击是一种常见的Web攻击手段,常见的攻击流程为: 假设现在你有一个前端站点A和后端站点B,前端站点A使用Ajax的GET请求后端站点B的接口/withdraw/?money=1000&account=yinkh可以向账号yinkh提现一千元,整个过程使用token认证或者session认证,用户的身份信息会被缓存在用户的浏览器中。现在假设有不法分子架设了一个站点C,在站点C中放入一张图片其src路径设置为/withdraw/?money=1000&account=xxxx,不法分子再将站点C的链接通过一定的方式诱导你在缓存有后端站点B的浏览器中访问,如果后端站点B没有做跨域访问控制的话,你就将像不法分子的账户xxxx提现一千元。
而跨域访问控制是通过验证请求来源站点,以防止跨域攻击。只有你将前端站点A对应的域名添加至后端站点B的可信列表中,你才能正确的请求对应的API接口,否则请求将被后端站点B拒绝。
配置:
$ pip install django-cors-headers
settings.py
INSTALLED_APPS = [ ... 'corsheaders', ... ] # 设置middleware MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... ] # 重点,设置信任站点 if DEBUG: CORS_ORIGIN_ALLOW_ALL = True else: CORS_ORIGIN_WHITELIST = ( 'www.example.com', )
生产环境下需要使用CORS_ORIGIN_WHITELIST,将你信任的前端站点域名加入CORS_ORIGIN_WHITELIST列表中,该域名不要以http://或者https://开头