浏览器安全知识复习

浏览器的安全是基于同源政策,同源要同时满足三个条件:
协议相同 域名相同 端口相同

如若网站非同源,则会有三个限制:
(1) Cookie、LocalStorage 和 IndexDB 无法读取。
(2) DOM 无法获得。
(3) AJAX 请求不能发送。
可以通过设置 document.domain来共享cookie

如果两个窗口一级域名相同,只是二级域名不同,那么设置document.domain属性,就可以规避同源政策,拿到DOM。

对于完全不同源的网站,目前有三种方法,可以解决跨域窗口的通信问题。
1.片段识别符(fragment identifier)(主要是由于url带#访问页面,页面不刷新): 通过URL的#号携带数据,然后,监听window.onhashchange = function() {console.log(window.location.hash)} 
2.window.name:浏览器窗口有window.name属性。这个属性的最大特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页可以读取它。
父窗口先打开一个子窗口,载入一个不同源的网页,该网页将信息写入window.name属性。
window.name = data;
接着,子窗口跳回一个与主窗口同域的网址。
location = 'http://parent.url.com/xxx.html';
然后,主窗口就可以读取子窗口的window.name了。
var data = document.getElementById('myFrame').contentWindow.name;
适应父子窗口
3.window.postMessage 跨文档通信API(Cross-document messaging):这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源。
举例来说,父窗口http://aaa.com向子窗口http://bbb.com发消息,调用postMessage方法就可以了。
var popup = window.open('http://bbb.com', 'title');
popup.postMessage('Hello World!', 'http://bbb.com');
window.opener.postMessage('Nice to see you', 'http://aaa.com');
window.addEventListener('message', function(e) {
  console.log(e.data);
},false);
LocalStorage也是通过这种方法实现跨资源分享


AJAX请求实现跨资源
1.jsonp: <script src="ex.com?callback=cb"></script> function cb (data) {console.log(data)}
2.WebSocket: WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。
3.CORS:"跨域资源共享"(Cross-origin resource sharing)CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
简单请求:(1) HEAD GET POST 
(2) Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain 同时满足其中之一,即构成简单请求
浏览器直接发出CORS请求,在请求头中增加Origin(源),如果返加正常,则服务器响应的内容里会有Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true(显示表达发送cookie) (在请求api中,根据需求设置withCredentials)
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
如果报错,则Access-Control-Allow-Origin这个字段不存在,控制台会报错
如果要发送Cookie,Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。

非简单请求:
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。

浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

预检响应的信息除了Origin字段,"预检"请求的头信息包括两个特殊字段。

(1)Access-Control-Request-Method

该字段是必须的,用来列出浏览器的CORS请求会用到哪些HTTP方法,上例是PUT。

(2)Access-Control-Request-Headers

该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段,上例是X-Custom-Header。

如果Origin、Access-Control-Request-Method和Access-Control-Request-Headers在服务端确认是可以跨资源的,即会发起正常请求,若否,则控制台报错

Access-Control-Max-Age这个可以设置预检有效时间

以上内容摘自 阮大大 文章 http://www.ruanyifeng.com/blog/2016/04/cors.html,复习笔记,感谢阮大大。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值