同源策略(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架构师技术进阶路线图
