首页 文章

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

提问于
浏览
0

我有一些工作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 请求的响应确实到达,所有预期的 Headers 指示(例如)1120字节的内容,但是,当我单击"Response"选项卡时,其中没有任何内容: 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

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

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

    您可以查看Mozilla中的示例,您将看到对POST的响应包括ACAO标头 .

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

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

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

    https://portswigger.net/burp/

相关问题