原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。
Django网络安全
【Django网络安全】如何正确设置跨域
【Django网络安全】如何正确防护CSRF跨站点请求伪造
文章目录
一、同源策略
同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源, 即协议不同,域名不同或者端口不同的都是非同源的
浏览器只阻止表单以及 ajax 请求,并不会阻止 src 请求,所以能访问cnd,图片等 src 请求
CORS,Cross-Origin Resource Sharing,是一个新的 W3C 标准,它新增的一组HTTP首部字段,允许服务端其声明哪些源站有权限访问哪些资源。换言之,它允许浏览器向声明了 CORS 的跨域服务器,发出 XMLHttpReuest 请求,从而克服 Ajax 只能同源使用的限制。在我们的django框架中就是利用CORS来解决跨域请求的问题。
二、django解决
建议结合django-cors-headers和django配置,管理跨域相关的内容,比如白名单、子域等。重点是第5步。
1.安装
pip install django-cors-headers
2.配置INSTALLED_APPS
INSTALLED_APPS = (
...
'corsheaders',
...
)
3.配置MIDDLEWARE中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
4.django-cors-headers中的参数
1.配置白名单
CORS_ALLOWED_ORIGINS 是新的参数名,CORS_ORIGIN_WHITELIST 是老的参数名,现在都可以使用,选择一个就行。
# 新
CORS_ALLOWED_ORIGINS = [
"https://feishu.spacety.com",
"http://localhost:80",
"http://127.0.0.1:80",
"http://192.168.18.156:80",
"http://192.168.18.161:5173",
]
# 老
CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:2020',
'http://127.0.0.1:1010',
)
2.自定义路径的正则匹配
一个正则表达式,用于限制将为其发送 CORS 标头的 URL。 默认为 r’^.*$',即匹配所有 URL。 当您只需要站点的一部分上的 CORS 时很有用,例如 /api/ 上的 API。
CORS_URLS_REGEX = r"^/api/.*$"
3.允许所有源
CORS_ALLOW_ALL_ORIGINS 为新参数,CORS_ORIGIN_ALLOW_ALL为老参数,选择其中一个就可以默认值为False,如果设置为True,第一步中的白名单将失效。这个参数不建议使用。
CORS_ALLOW_ALL_ORIGINS =True
CORS_ORIGIN_ALLOW_ALL =True
4.设置自定义请求头参数
默认可以使用的非标准请求头,需要使用自定义请求头时,就可以进行修改
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
‘new’
)
5.允许的 HTTP
默认允许全部的请求方法
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
)
6.允许跨域请求携带cookie
CORS_ALLOW_CREDENTIALS
CORS_ALLOW_CREDENTIALS = True # 允许携带cookie
5.结合django的csrf配置
这个参数是django配置setiings的参数,可参考官方文档
1.csrf集成CORS
CORS和CSRF是分开的,Django无法使用你的CORS来。 配置以免除站点的引用检查,以使其在 安全请求。做到这一点的方法是使用其CSRF_TRUSTED_ORIGINS设置。
CORS_ALLOWED_ORIGINS = [
"http://read.only.com",
"http://change.allowed.com",
]
CSRF_TRUSTED_ORIGINS = [
"http://change.allowed.com",
]
2.设置CSRF Cookie时要使用的域
这个将限制请求的来源,默认值为None,不设置。
CSRF_COOKIE_DOMAIN = 'spacety.com'
版权归原作者 我辈李想 所有, 如有侵权,请联系我们删除。