对于一个项目,我正在研究各种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(); }
提前致谢。
对于“简单”的HTTP动词(例如GET或POST),是的,将获取整个页面,然后浏览器确定JavaScript是否可以使用其内容。服务器不需要知道请求来自何处;它是 浏览器的 工作检查来自服务器的答复,并决定是否JS被允许看到的内容。
对于“非简单” HTTP动词(例如PUT或DELETE),浏览器使用OPTIONS请求发出“预检请求”。在这种情况下,浏览器首先通过分别检查和来检查是否支持域 和 动词。(有关更多信息,请参见HTML5 Rocks 的CORS页面上的“ 处理不太简单的请求 ” 。)飞行前响应还列出了允许的非简单标头,包括在中。Access-Control-Allow-Origin``Access-Control-Allow- Methods __Access-Control- Allow-Headers
Access-Control-Allow-Origin``Access-Control-Allow- Methods
Access-Control- Allow-Headers
这是因为即使JavaScript从未看到过跨域结果,允许客户端向服务器发送DELETE请求也可能非常糟糕- 再次提醒您,请记住,服务器通常没有任何义务来验证请求来自合法域(尽管 可以 使用Origin请求中的标头这样做)。
Origin