同源策略一点理解

参考:浏览器的同源策略

同源策略(sop)

定义

同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的浏览器的安全机制。

  • 同协议

  • 同端口

  • 同域名(子域主域都相同)

同源限制了什么

1.png

简单说就是,同源策略限制的是两个不同源网站间的相应(读),而不限制请求(写)。

CORS

HTTP访问控制(CORS)
跨域 HTTP 请求(cross-origin HTTP request),是一个跨域资源共享机制。
它所针对的,仍然是响应这步,而非请求。
限制请求来源,为*的时候表示:任何网站请求我,你都可以拿到响应:

header("Access-Control-Allow-Origin: *");

只有victim.com请求我才能拿到响应信息:

 header("Access-Control-Allow-Origin: http://victim.com");

这个设置为true和false丝毫不影响别人来请求我时带不带cookie(但是它和cookie有关),上面已经说了,cors只管得到响应,不管请求。
具体作用看下面实例

header("Access-Control-Allow-Credentials: true");

实例

ajax是受同源策略限制的,这里用ajax来做实验,
attack.php,位于http://attack.com/attack/attack.php,用于模拟向目标发起一个post请求。

<script>
    var xmlhttp;
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    }
    xmlhttp.onreadystatechange = function () {
        if(xmlhttp.readyState === 4){
            if(xmlhttp.status === 200){
                console.log(xmlhttp.responseText);
            }
        }else{
            console.error(xmlhttp.statusText);
        }
    }
    xmlhttp.onerror = function (e) {
        console.error(xmlhttp.statusText)
    }
    xmlhttp.withCredentials = true; //携带本地cookie
    xmlhttp.open('post', 'http://victim.com/victim/victim.php', true);
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    var data = 'data=321';
    xmlhttp.send(data);
    alert('send...')
</script>

victim.php,位于http://victim.com/victim/victim.php,用于接收请求并做出响应。

<?php
header("Access-Control-Allow-Origin: http://victim.com");
header("Access-Control-Allow-Credentials: true");
if(isset($_POST['data'])){
    $p = "post:".$_POST['data']."\r\n";
    $c = "cookie:".$_COOKIE['id'];
    $f = fopen('log.txt', 'w');
    fwrite($f, $p);
    fwrite($f, $c);
    fclose($f);
    echo 'Got a post!';
}

首先,我将victim.com和attack.com都解析到了127.0.0.1,
然后在victim.com渔下设置了一个cookie,

2.png

1.当Access-Control-Allow-Origin设置为http://attack.com,Access-Control-Allow-Credentials:设置为true的时候,表示允许attack.com带着cookie请求我并拿到响应。

3.png

2.把Access-Control-Allow-Credentials设置为false,表示attack.com带着cookie来请求我,拿不到响应,

4.png

3.那我们就试试不带cookie请求,注释掉这一行

5.png

果然,收到了响应,

6.png

4.现在,我们已经大致了解这两个参数是干嘛的了,一个控制来源,一个控制cookie。
5.还有一种情况,就是Access-Control-Allow-Origin为“”的时候,为“”表示支持任何来源。试想,如果目标网站支持任何网站对其的跨域资源读写,后果将非常恐怖。因此,浏览器又做了一层限制,
就是当其为“*”的时候,Access-Control-Allow-Credentials的值即使是true,都无法实现带cookie跨域。

7.png

8.png

最后,再次重申,同源策略限制的是响应,而非请求。我们上面的每次请求,目标都是收到了的,

9.png

总结

以前也算看过一些同源策略方面的东西,但是一用起来却发现还是理解的不深。这次我用代码去实验了整个过程,现在至少清晰的认识到这是怎么一回事了。
看来,学习一个漏洞的最好方法,就是用代码把它跑出来。

标签: none

添加新评论