同源策略(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是否在根目录下,也会使得一些上传文件的攻击失效。

经验分享 程序员 微信小程序 职场和发展