对于一个项目,我正在研究各种 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();
}
提前致谢。
对于像 GET 或 POST 这样的“简单”HTTP 动词,是的,会获取整个页面,然后浏览器决定 JavaScript 是否使用这些内容。服务器不需要知道请求来自哪里;检查服务器的回复并确定是否允许 JS 查看内容是浏览器的工作。
对于像 PUT 或 DELETE 这样的“非简单”HTTP 动词,浏览器使用 OPTIONS 请求发出“预检请求”。在这种情况下,浏览器首先通过分别检查 Access-Control-Allow-Origin
和
Access-Control-Allow-Methods
来检查域 和动词是否受支持。 (有关更多信息,请参阅 HTML5 Rocks 的 CORS 页面上的“处理不那么简单的请求”。)预检响应还列出了允许的非简单标头,包含在
Access-Control-Allow-Headers
中。
这是因为允许客户端向服务器发送 DELETE 请求可能会非常糟糕,即使 JavaScript 永远不会看到跨域结果 - 再次记住,服务器通常没有任何义务来验证请求来自合法域(尽管它可能使用请求中的
Origin
标头来这样做)。
那么,是否只是浏览器和 Javascript 阻止了 responseText 以任何实质性方式使用,即使它实际上已被传输?
是的。您可以使用 JS 提出任何您喜欢的请求。
同源策略阻止访问数据。
进行恶意操作的请求(例如“
POST http://bank.example/give/money?to=attacker
”或“POST http://forum.example.com/post?message=spamspamspamspam"
”)被称为CSRF攻击,必须由服务器防御。