尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可。浏览器的各种保安措施之间都试图保持相互独立,但是攻击者只要能在出错的地方注入少许JavaScript,所有安全控制几乎全部瓦解——最后还起作用的就是最弱的安全防线:同源策略。同源策略管辖着所有保安措施,然而,由于浏览器及其插件,诸如Acrobat
Reader、Flash 和Outlook Express漏洞频出,致使同源策略也频频告破。
既然web应用的最弱安全防线是同源策略,那什么是同源策略呢?如何去攻破同源策略呢?如何黑web应用呢?
同源策略,它是由Netscape提出的一个著名的安全策略。所有支持javascript的网站都会使用同源策略来保护自己的web应用。
同源策略又名同域策略,通俗易懂的来说,同源就是(主机名+协议+端口号【若存在】)三者相同。也就是说javascript只可以操作自己域下的东西,不能操作其他域下的东西。比如百度下javascript是不可操作谷歌下的页面。
那为什么要同源策略呢?
如上述所述,同源策略,javascript操作自己web应用,不得操作别人web应用。既然如此,也就是别人无法操作自己web应用,是保证web安全的一种方式。
假设别人可以操作自己web应用,试想是否很可怕?假如你打开网银页面,蹦出一个恶意广告,当你关闭广告,若没有同源策略,是不是代表恶意广告会操作你网银页面,通过javascript窃取你网银的信息。
那了解了同源策略,下面举几个url判断是否在同一个域中。
假设url地址:http://store.company.com/dir/page.html检测下面是否他的同源地址。
其url的协议:http;主机名:store.company.com 端口号没有或者其相应服务器的默认值
URL | 结果 | 原因 |
http://store.company.com/dir2/other.html | 是 | |
http://store.company.com/dir/inner/another.html | 是 | |
https://store.company.com/secure.html | 不是 | 协议不相同 |
http://store.company.com:81/dir/etc.html | 不是 | 端口号不相同 |
http://news.company.com/dir/other.html | 不是 | 主机名不相同 |
同源策略概念已经解释,至于黑web应用,这个我能力尚浅,呵呵两字飘过~
任何事物都是相对的,既然存在同源策略,肯定会存在访问不同源的情况。那该怎么办呢?
上文也提到,同源即同域,不同源,即跨域。
那我若想跨域,怎么办呢?
目前ajax一般做法是不支持跨域的,但是随着跨域的需求呼声越来越强烈,目前跨域基本常用实现方式有两种JSONP和CORS方式。
其中link、img可以跨域访问,比如程序中img链接到百度图片,但是浏览器会阻止javascript读写操作的。
当你跨域访问时,会提示如下:
FireFox29:
已阻止交叉源请求:同源策略不允许读取 http://localhost:8089/crcp/rcp/t99eidt/testcors.do 上的远程资源。可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题。
IE11:
SCRIPT7002: XMLHttpRequest: 网络错误 0x2efd, 由于出现错误 00002efd 而导致此项操作无法完成。
下篇博客介绍跨域两种解决方案的原理以及具体实施代码。
解说同源策略和跨域访问