XMLHttpRequest如何与同源策略结合使用

时间:2014-12-14 12:30:25

标签: html security http xmlhttprequest same-origin-policy

我在www.foodomain.com上托管了一个基本HTML,其中包含一个简单的脚本,只是尝试对位于另一个域(www.bardomain.com)的网站进行POST调用,以便挑起在该网站上执行的操作。 attacker.html文件是:

托管

<html lang="en">
<head>
<meta charset="utf-8">
<title>Attacker.html</title>
<script language="JavaScript" type="text/javascript">
    var http = new XMLHttpRequest();
    var url = "http://www.bardomain.com/attacked.php";
    var params = "action=deleteAll";
    http.open("POST", url, true);

    //Send the proper header information along with the request
    http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http.setRequestHeader("Content-length", params.length);
    http.setRequestHeader("Connection", "close");

    http.onreadystatechange = function() {//Call a function when the state changes.
        if (http.readyState == 4 && http.status == 200) {
            alert("fet");
        }
    }
    http.send(params);
</script>
</head>
<body>
     Some presentation text ...
</body>
</html>

据我所知,网络浏览器由于其同源策略而应该阻止该行为,但实际上对www.bardomain.com网站的POST调用已完成,但操作永远不会完成,因为apache服务器发送HTTP 302消息:

www.bardomain.com:80 192.168.56.1 - - [14/Dec/2014:12:57:30 +0100] "POST /attacked.php HTTP/1.1" 302 509 "http://www.foodomain/attacker.html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:34.0) Gecko/20100101 Firefox/34.0"

由于它是HTTP 302响应,因此操作并未真正完成,但我甚至不希望浏览器发送请求(因为它是另一个域)。如果有人能给我解释这种行为,我真的很感激。

另一方面,如果不是从apache访问attacker.html文件,而是在Eclipse Web浏览器中加载文件,发送POST消息并返回HTTP 200消息,则会发生另一种奇怪的行为,因此操作在www.bardomain.com上进行:

www.bardomain.com:80 192.168.56.1 - - [14/Dec/2014:13:20:52 +0100] "POST /attacked.php HTTP/1.1" 200 1586 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.78.2 (KHTML, like Gecko) Safari/522.0"

对这些行为的任何解释?

1 个答案:

答案 0 :(得分:0)

发送信息不会被阻止,但另一端可能不会发回任何信息。此外,如果找不到返回有效负载的CORS标头,则您的浏览器可能不会使用从主机域外部加载的脚本。

换句话说,整个跨站点请求安全性在它运行之前是双向握手。客户端(您的浏览器)通常使用动词OPTIONS发出请求,以验证它是否可以首先请求脚本。然后,服务器(另一端)回复您可以用来从域外请求东西的VERBS。

然后,当您实际请求资产时,客户端为服务器提供HOST信息以进行验证,如果一切正常,则会在返回时添加其他标头,告知客户端信息已被请求并且可以使用。< / p>

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing