什么是跨域
跨域是指从一个域名的网页去请求另一个域名的资源。比如从http://www.baidu.com/页面去请求google.com的资源。跨域的严格一点的定义是:只要协议,域名,端口有任何一个的不同,就被当成是跨域。
之所以要限制跨域访问,是因为如果一个网页可以随意地访问另外一个网站的资源,那么就有可能在客户完全不知情的情况下出现安全问题,比如下面的两种跨域攻击:
AJAX同源策略
用户访问www.mybank.com ,登陆并进行网银操作,这时cookie啥的都生成并存放在浏览器
用户突然想起件事,并迷迷糊糊地访问了一个邪恶的网站 www.xiee.com
这时该网站就可以在它的页面中,拿到银行的cookie,比如用户名,登陆token等,然后发起对www.mybank.com 的操作。
如果这时浏览器不予限制,并且银行也没有做响应的安全处理的话,那么用户的信息有可能就这么泄露了。
DOM同源策略
做一个假网站,里面用iframe嵌套一个银行网站 http://mybank.com。
把iframe宽高啥的调整到页面全部,这样用户进来除了域名,别的部分和银行的网站没有任何差别。
这时如果用户输入账号密码,我们的主网站可以跨域访问到http://mybank.com的dom节点,就可以拿到用户的输入了,那么就完成了一次攻击。
后台允许跨域请求的方法:
self.set_header(“Access-Control-Allow-Origin”, http_origin) #http_origin为指定域名
self.set_header(“Access-Control-Allow-Credentials”, “true”) #允许请求携带cookie
self.set_header(“Access-Control-Allow-Methods”, "")
self.set_header(“Access-Control-Allow-Headers”, “Content-Type,Accept,Authorization”)
self.set_header(“Access-Control-Max-Age”, “86400”)
tips:如果Access-Control-Allow-Origin没有设置特定域名而是设定为的话,Access-Control-Allow-Credentials会失效,即无法携带第三方请求,所有设定为*的话只能接受不带cookie的跨域请求