浏览器的跨域问题以及解决方案【Web安全技术之浏览器的跨域访问】
一、扫瞄器介绍
对于Web应用来说,扫瞄器是最重要的客户端。
目前扫瞄器五花八门多得不得了,除了Chrome、IE、Firefox、Safari、Opera这些国外的扫瞄器外,百度、腾讯、360、淘宝、搜狗、傲游之类的,反正能做的都做了。
扫瞄器虽然这么多,但扫瞄器内核主要就以下4种:
Trident:IE使用的内核。
Gecko:Firefox使用的内核。
WebKit:Safair和Chrome使用的内核。WebKit由苹果创造,Chrome 也用了,但是Google又开发了V8引擎替换掉了WebKit中的Javascript 引擎。
Presto:Opera使用的内核。iframe参数传递
国内的扫瞄器根本都是双核扫瞄器,使用基于WebKit的内核高速扫瞄常用网站,使用Trident内核兼容网银
等网站。
二、同源策略
同源策略是扫瞄器最根本的安全策略,它认为任何站点的内容都是担
心全的,所以当脚本运行时,只被允许访问来自同一站点的资源。
同源是指域名、协议、端口都一样。
假如没有同源策略,就会发生下面这样的问题:
恶意网站用一个iframe把真实的银行登录页放到他的页面上,当用户使用用户名密码登录时,父页面的javascript就可以读取到银行登录页表单中的内容。
甚至扫瞄器的1个Tab页翻开了恶意网站,另一个Tab页翻开了银行网站,恶意网站中的javascript可以读取到银行网站的内容。这样银行卡和密码就能被轻易拿走。
三、跨域访问
由于同源策略的缘由,扫瞄器对跨域访问做了许多限制,但有时我们确实需要做跨域访问,那要怎么办?
主要有以下几种状况:
1. iframe的跨域访问
同域名下,父页面可以通过ElementById(_iframe).contentWindow.document访问子页面的内容,但不同域名下会消失类似下面的错误:
Uncaught SecurityError: Blocked a frame with origin “” from accessing a frame with origin “”. Protocols, domains, and ports must match.
有两种解决方法:
1). 当主域名一样,子域名不同时,比拟简单解决,只需设置一样的document.domain即可。
如/a.html使用iframe载入/b.html,且在a.html中有Javascript
要修改b.html中元素的内容时,可以像下面的代码那样操作。
a.html
html head script document.domain = ““; function changeIframeContent() { var _iframe = docum
_ElementById(“_p“); _p.innerHTML = “Content from a.html“; } /script /head body iframe id=_iframe src=/demo/iframe/subdomain/b.html/iframe br input type=button value=Change iframe content onclick=changeIframeContent();/ /body /html b.html
html head script document.domain = ““; /script /head body p id=_pb.html/p /body /html 2). 当主域名
不同时,就特别麻烦了。大致的方法像下面描述的那样:
下有a.html;
a.html创立iframe加载下的
b.html,可在加载b.html时通过?或#
将参数传递到b.html中;
b.html加载后,可以通过提取location.search或location.hash 中的内容猎取a.html传过来的参数;
b.html创立一个iframe,加载下的
c.html,并且参数也通过?或#传给c.html;
由于 c.html和 a.html是一样域名,所以 c.html可以使用parent.parent访问到a.html的对象,这样也就可以将b.html需要传递的参数传回到a.html中。
2. Ajax的跨域访问
Ajax主要通过XMLHttpRequest对象实现,但是假如通过XMLHttpRequest访问不同域名下的数据,扫瞄器会消失类似下面的错误:
这时可由以下两种方法解决:
1). 使用script代替XMLHttpRequest,也就是JSONP的方法。利用script标签的src下加载的js不受同源策略限制,并且加载后的js运行在当前页面的域下,所以可自由操作当前页面的内容。
下面的代码演示了在下的a.html通过下的b.js中的内容来更新自身的p标签。
下面的代码演示了在下的a.html通过下的b.js中的内容来更新自身的p标签。
a.html
html head script function update_p (content) { ElementById(_p).innerHTML = content; } function getFromB() { var _script = ateElement(script); _pe = text/javascript; _script.src = /demo/ajax/b.js; ElementsByTagName(head)[0].appendChild(_script); } /script /head body p id=_pa.html/p input type=button value=Get from onclick=getFromB()/ /body /html b.js
update_p(content from b.js); 在实际使用中,通常a.html会
将update_p以callback参数名传递给的效劳器,效劳器动态生成数据后,
再用callback参数值包起来作为响应回传给a.html。
2). 在的效劳器返回信息中增加以下头信息:
Access-Control-Allow-Origin:
Access-Control-Allow-Methods: GET
此时扫瞄器便允许读取使用GET恳求的内容。
对于flash来说,会要求在网站根名目下放一个名为l的文件,以指明允许访问的域名来源。文件中的内容类
似下面的样子:
cross-domain-policy allow-access-from domain=* /
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论