浏览器安全之同源策略

同源策略

同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,若是缺乏了同源策略,则浏览器的正常功能可能会受到影响.能够说Web是构建在同源策略的基础之上的,浏览器只是针对同源策略的一种实现.html

浏览器的同源策略,限制了来自不一样源的"document"或脚本,对当前"document"读取或设置某些属性.影响"源"的因素有:协议,域名,端口号.
须要注意的是,对于当前页面来讲,页面存放JavaScript文件的域并不重要,重要的是加载JavaScript页面所在的域是什么.跨域

在浏览器中,<script>,<img>,<ifram>,<link>等标签均可以跨域加载资源,而不受同源策略的限制.这些带"src"属性的标签每次加载时,其实是由浏览器发起了一次GET请求.不一样于XMLHttpRequest的是,经过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读写返回的内容.浏览器

XMLHttpRequest受到同源策略的约束,不能跨域访问资源.若是XMLHttpRequest可以跨域访问资源,则可能会致使一些敏感数据泄露,好比CSRF的token,从而致使发生安全问题.安全

可是互联网是开放的,随着业务的发展,跨域请求的需求愈来愈迫切,所以W3C委员会制定了XMLHttpRequest跨域访问标准.它须要经过目标域返回的HTTP头来受权是否容许跨域访问,由于HTTP头对于JavaScript来讲通常是没法控制的.dom

对于浏览器来讲,除了DOM,Cookie,XMLHttpRequest会受到同源策略的限制外,浏览器加载的一些第三方插件也有各自的同源策略.最多见的一些插件如Flash,Java Applet等都有本身的控制策略.以Flash为例,它主要经过目标网站提供的crossdomain.xml文件判断是否容许当前
"源"的Flash跨域访问目标资源.网站

然而浏览器的同源策略也并不是坚如盘石,因为实现上的一些问题,一些浏览器的同源策略也曾经被屡次绕过.好比下面这个IE8的CSS跨域漏洞.url

www.a.com/test.html插件

<body>
{} body {font-family:
aaaaaaaaaaaa
bbbbbbbbbbb

</body>

www.b.com/test2.htmlcode

<style>
@import url("http://www.a.com/test.html")
</style>
<script>
setTimeout(function() {
  var t = document.body.currentStyle.fontFamily;
  alert(t);
},2000);

在"www.b.com/test2.html"汇总经过@import加载了"http://www.a.com/test.html"为CSS文件,渲染进入当前页面DOM,同时经过"document.body.currentStyle.fontFamily"访问内容.问题发生在IE的CSS PARSE的过程当中,IE将fontFamily后面的内容当作了value,从而能够读取"www.a.com/test.html"的页面内容.xml

相关文章
相关标签/搜索