一尘不染

了解基于CORS的XMLHttpRequest(responseText)

javascript

对于一个项目,我正在研究各种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();
}

提前致谢。


阅读 314

收藏
2020-05-01

共1个答案

一尘不染

对于“简单”的HTTP动词(例如GET或POST),是的,将获取整个页面,然后浏览器确定JavaScript是否可以使用其内容。服务器不需要知道请求来自何处;它是
浏览器的 工作检查来自服务器的答复,并决定是否JS被允许看到的内容。

对于“非简单”
HTTP动词(例如PUT或DELETE),浏览器使用OPTIONS请求发出“预检请求”。在这种情况下,浏览器首先通过分别检查和来检查是否支持域
动词。(有关更多信息,请参见HTML5 Rocks
CORS页面上的“ 处理不太简单的请求
。)飞行前响应还列出了允许的非简单标头,包括在中。Access-Control-Allow-Origin``Access-Control-Allow- Methods __Access-Control- Allow-Headers

这是因为即使JavaScript从未看到过跨域结果,允许客户端向服务器发送DELETE请求也可能非常糟糕-
再次提醒您,请记住,服务器通常没有任何义务来验证请求来自合法域(尽管 可以 使用Origin请求中的标头这样做)。

2020-05-01