JavaScript跨域请求成功但数据被过滤掉

时间:2016-08-26 10:19:07

标签: javascript cross-domain

我有一些工作的JavaScript(在Firefox(v41)中运行),我需要修改它以支持跨域XMLHttpRequests(我的POST请求检索JSON编码数据)。我控制了有问题的服务器,因此我捕获OPTIONS个请求并回复:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, X-Requested-With
Access-Control-Max-Age: 86400

浏览器然后正确发送POST请求,我的服务器响应数据并且数据返回到我的机器;我可以在Wireshark中看到它,它是格式良好的JSON。

但是,数据无法访问我的JavaScript。我可以在Firefox窗口中看到对POST请求的响应到达,所有预期的标题指示(例如)1120字节的内容但是,当我点击&时#34;响应"标签,其中没有任何内容:SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data。我的JavaScript代码最终出现在XMLHttpRequest的onerror函数中。

我需要做些什么才能正确获取数据?欢迎任何建议。

以下是一个完整的HTTP交换示例,如浏览器计算机上的Wireshark所示:

    OPTIONS /getAllData HTTP/1.1
    Host: blah:blah
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-GB,en;q=0.5
    Accept-Encoding: gzip, deflate
    Origin: null
    Access-Control-Request-Method: POST
    Access-Control-Request-Headers: content-type
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache

    HTTP/1.1 200 OK
    Access-Control-Allow-Headers: Content-Type, X-Requested-With
    Access-Control-Allow-Methods: GET, POST, OPTIONS
    Access-Control-Allow-Origin: *
    Access-Control-Max-Age: 86400
    Date: Fri, 26 Aug 2016 09:22:14 GMT
    Content-Length: 0
    Content-Type: text/plain; charset=utf-8
    test

    POST /getAllData HTTP/1.1
    Host: blah:blah
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-GB,en;q=0.5
    Accept-Encoding: gzip, deflate
    Content-Type: application/string; charset=UTF-8
    Content-Length: 4
    Origin: null
    Connection: keep-alive
    Pragma: no-cache
    Cache-Control: no-cache

    HTTP/1.1 200 OK
    Content-Type: application/json;charset=UTF-8
    Date: Fri, 26 Aug 2016 09:22:15 GMT
    Content-Length: 1121
    {"wellformed":"data 1121 bytes long"}

1 个答案:

答案 0 :(得分:0)

我玩过Access-Control-Allow-Origin,并且需要在发送给客户端的每个响应中实现标头。

因此,无论何时进行POST,答案都必须包含ACAO标头,否则浏览器会出于安全目的过滤掉内容。我没有看到你捕获的标题,这可能解释了这个问题。

您可以查看Mozilla中的示例,您将看到对POST的响应确实包含ACAO标题。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

此外,您的正文内容似乎没有通过传统的空行(在HTTP协议中为\ r \ n)与标题分隔。身体似乎是你的粘贴中的标题的一部分,但它可能只是你的复制粘贴的故障。如果不是,那么它也是一个可能的解释:没有身体=没有内容。

最后,我建议您通过BurpSuite等工具调试您的流量,这个工具实现了一个很好的代理,不仅可以实时查看和编辑您的请求,还可以重放它们并玩具。最初是一个安全工具,它仍然适用于调试Web应用程序。

https://portswigger.net/burp/