同源策略(Same Origin Policy)
前言
本文内容参考《白帽子讲Web安全》
1、同源策略是干嘛的
浏览器的同源策略,限制不同源的“document”或脚本,对当前的“document”读取或设置某些属性。
2、什么是同源?
我们来看一个例子: 以http://www.example.com/dir/index.html为例:
http://www.example.com/dir2/other.html 同源 只有路径不同 https://www.example.com/secure.html 不同源 协议不同 http://www.example.com:81/dir/etc.html 不同源 端口不同 (默认端口是80) http://news.example.com/dir/other.html 不同源 域名不同
由上图可以看出,影响源的因素有:
1. host(域名或者IP地址); 2. 子域名; 3. 端口; 4. 协议。
3、影响范围
在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以跨域加载资源,而不受同源策略的影响。这些带“src”的标签每次加载的时候,实际上是向浏览器发送了一次GET请求。同时src属性加载的资源,浏览器限制了JavaScript的权限,时期不能读、写返回的内容。
对于XMLHttpRequest来说,它可以访问来自同源对象的内容。例子如下:
<html> <head> <script type="text/javascript"> var xmlhttp; function loadXmlDoc(url){ xmlhttp = null; if(window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest; }else if(window.ActiveXObject){ xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if(xmlhttp!=null){ xmlhttp.onReadystatechange=state_Change; xmlhttp.open("GET",url,true); xmlhttp.send(null); } else{ alert("Your browser does not support XMLHTTP!"); } } function state_Change(){ if(xmlhttp.readyState == 4){ if(xmlhttp.status == 200){ document.getElementById(T1).innerHTML=xmlhttp.responseText; } else{ alert("Problem retrieving date:"+xmlhttp.statusText); } } } </script> </head> <body onload="loadXMLDoc(/example/test_xmlhttp.txt)"> <div id="T1" style="border: 1px solid black; height:40; width:300"></div><br /> <button onclick="loadXMLDoc(/example/test_xmlhttp2.txt)">Click</button> </body> </html>
但是,XMLHttpRequest受到同源策略的影响,不能跨域访问资源,在AJAX应用的开发中需要注意。
4、发展
在Flash9及之后的版本,还实现了MIME检查以确定crossdomain.xml是否合法,比如查看服务器返回HTTP头的Content-Type是否是text/*、application/xml、application/xhtml+xml。这样做的原因,是因为攻击者可以通过上传crossdomain.xml文件控制Flash的行为,绕过同源策略。除了MIME检查外,Flash还会检查crossdomain.xml是否在根目录下,也会使得一些上传文件的攻击失效。
上一篇:
Java架构师技术进阶路线图