【问题标题】:XMLHttpRequest response access denied despite same-origin尽管同源,但 XMLHttpRequest 响应访问被拒绝
【发布时间】:2015-11-21 07:56:03
【问题描述】:

响应是 JSON


Edge:有时将响应属性值短暂插入 DOM,然后将其删除,有时会记录错误“SCRIPT5:访问被拒绝”(表示 CORS),响应完全可从调试器访问,请求显示在网络选项卡中

Chrome:响应空字符串,请求未显示在网络选项卡中,无控制台消息

Firefox:控制台错误'response "malformed JSON"' on breakpoint line using response in JSON.parse(),因此在使用前,请求未显示在网络选项卡、Firebug 和集成中


JS(仅限当前浏览器):

var session = "";
var request;
function checkLogin()
{
    if(request.readyState > 3)
    {
        var response = JSON.parse(request.response);
        if(verify(response))  // verify inserts argument property "error" in DOM on error via innerHTML on element
        {
            // do something
        }
    }
}
function login()
{
    request = new XMLHttpRequest();
    request.onreadystatechange = checkLogin;
    request.open("GET", "authenticateUser.php?user=" + document.getElementById("user").value + "&credential="+md5(document.getElementById("password").value));
    request.send();
}

来自网络标签的边缘请求:

Anforderungs-URL: http://*MYDOMAIN*/authenticateUser.php?user=df&credential=d41d8cd98f00b204e9800998ecf8427e
Anforderungsmethode: GET
Statuscode: 200 / OK
 - Anforderungsheader
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: de-DE, de; q=0.8, en-US; q=0.5, en; q=0.3
Connection: Keep-Alive
Host: *MYDOMAIN*
Referer: http://*MYDOMAIN*/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
 - Antwortheader
Connection: Keep-Alive
Content-Length: 65
Content-Type: application/json
Date: Sat, 21 Nov 2015 07:42:17 GMT
Keep-Alive: timeout=15, max=94
Server: Apache
X-Powered-By: PHP/5.5.29

回复:

{"success":false,"error":"authentication failed or unauthorised"}

什么会使我的 phps 响应在 JS 代码中可用(在 Chrome 和 Firefox 中),并且它的属性值可以插入到 DOM 中?

【问题讨论】:

  • console.log 在您尝试解析 request.response 并验证它是有效的 JSON 之前
  • console.log 与上面“响应”下的内容完全相同。我相信它是有效的 JSON。感谢您的提示。
  • 有些奇怪:即使是 Charles 也不显示 xhr 的网络流量。但这是一个新的回应(在 Edge 中)。 Windows 任务管理器性能选项卡显示正在传输的数据。

标签: javascript json xmlhttprequest


【解决方案1】:

login() 是onsubmit 的处理程序。我没有return false;因此,用户和 pw 来自的表单 - 没有任何操作 - 提交到自己的页面并使浏览器重新加载页面:取消 Chrome 和 Ff 中的请求。只有 Edge 让等页 JS 处理来自前一个加载请求的响应 - 直到它被插入。

我花了 6 个小时,绕过 JSONP 和 Charles,然后列出了来自 Chrome 的网络流量,页面本身在请求之后出现,因此让我知道页面“重新加载”并最终记住 onsubmits 处理程序取消了提交返回 false 并提交导致加载操作(如果没有,则为自身),这就是这里发生的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多