20

对于一个项目,我正在研究各种 HTML5 和 Javascript 元素以及它们周围的安全性,我现在正试图了解 CORS。

根据我的测试,如果我删除..

<?php
 header("Access-Control-Allow-Origin: *"); 
 header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
 ?>

..从尝试访问的页面中,我在 Chrome 的控制台日志中看到以下内容:

XMLHttpRequest cannot load http://www.bla.com/index.php. Origin http://bla2.com is not allowed by Access-Control-Allow-Origin.

我理解这是正确的,但是 Wireshark 在返回中显示 HTTP/1.1 200 OK,并且在数据中显示了所请求页面的来源。那么,即使它实际上已被传输,是否只是浏览器和 Javascript 阻止了 responseText 以任何实质性方式被使用?

代码如下:

  function makeXMLRequest() {
  xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4) {
        alert(xmlhttp.responseText);
    }
}
xmlhttp.open("GET","http://www.bla.com/index.php",true);
xmlhttp.send();
}

提前致谢。

4

2 回答 2

39

对于像 GET 或 POST 这样的“简单”HTTP 动词,是的,整个页面都被获取,然后浏览器决定 JavaScript 是否可以使用这些内容。服务器不需要知道请求来自哪里;检查来自服务器的回复并确定是否允许 JS 看到内容是浏览器的工作。

For a "non-simple" HTTP verb like PUT or DELETE, the browser issues a "preflight request" using an OPTIONS request. In that case, the browser first checks to see if the domain and the verb are supported, by checking for Access-Control-Allow-Origin and Access-Control-Allow-Methods, respectively. (See the "Handling a Not-So-Simple Request" on the CORS page of HTML5 Rocks for more information.) The preflight response also lists permissible non-simple headers, included in Access-Control-Allow-Headers.

This is because allowing a client to send a DELETE request to the server could be very bad, even if JavaScript never gets to see the cross-domain result -- again, remember that the server is generally not under any obligation to verify that the request is coming from a legitimate domain (although it may do so using the Origin header from the request).

于 2012-11-15T15:40:07.143 回答
6

那么,即使它实际上已被传输,是否只是浏览器和 Javascript 阻止了 responseText 以任何实质性方式被使用?

是的。您可以使用 JS 提出任何您喜欢的请求。

它是对同源策略阻止的数据的访问。

做恶意事情的请求(例如“ POST http://bank.example/give/money?to=attacker”或“ ” POST http://forum.example.com/post?message=spamspamspamspam")称为CSRF攻击,必须由服务器进行防御。

于 2012-11-15T15:25:30.097 回答