技术之跨域
跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制
例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。
注意:
跨域限制访问,其实是浏览器的限制。 跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了
为什么要限制跨域
1.AJAX同源策略主要用来防止CSRF攻击。如果没有AJAX同源策略,相当危险,我们发起的每一次HTTP请求都会带上请求地址对应的cookie,那么可以做如下攻击:用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识。用户浏览了恶意页面 http://evil.com。执行了页面中的恶意AJAX请求代码。http://evil.com向http://mybank.com发起AJAX HTTP请求,
请求会默认把http://mybank.com对应cookie也同时发送过去。银行页面从发送的cookie中提取用户标识,验 证用户无误,response中返回请求数据。此时数据就泄露了。而且由于Ajax在后台执行,用户无法感知这一过程。
2.DOM同源策略也一样,如果iframe之间可以跨域访问,可以这样攻击:做一个假网站,里面用iframe嵌套一个银行网站 http://mybank.com。把iframe宽高啥的调整到页面全部,这样用户进来除了域名,别的部分和银行的网站没有任何差别。这时如果用户输入账号密码,我们的主网站可以跨域访问到http://mybank.com的dom节点,就可以拿到用户的输入了,那么就完成了一次攻击。
要解决跨域的问题,我们可以使用以下几种方法:
1、通过jsonp跨域
2、通过修改document.domain来跨子域
3、使用window.name来进行跨域
4、使用HTML5中新引进的window.postMessage方法来跨域传送数据
使用postMessage来跨域传送数据还是比较直观和方便的,但是缺点是IE6、IE7不支持,所以用不用还得根据实际需要来决定。
除了以上几种方法外,还有flash、在服务器上设置代理页面等跨域方式,这里就不做介绍了。
以上四种方法,可以根据项目的实际情况来进行选择应用,window.name的方法既不复杂,也能兼容到几乎所有浏览器,是极好的一种跨域方法。