【问题标题】:XMLHttpRequest.send failing with relative pathXMLHttpRequest.send 相对路径失败
【发布时间】:2013-11-21 04:34:10
【问题描述】:

我在一些可能可以补救的事情上遇到困难。我正在开发一个没有服务器的网站。这样做时,我在尝试通过 XMLHttpRequest 访问文件时遇到了问题。

正如您在示例代码 sn-p 中看到的,我创建了变量,使用所需文件的相对路径打开它,然后使用发送函数。

当我使用必须遍历父目录的相对路径时,send() 函数失败。但是,如果我提供的路径要么与网页位于同一目录中,要么在当前网页目录的子文件夹中转发,我会看到 XMLHttpRequest 成功返回。在这些成功案例中,我可以在request.responseText中看到测试文件的数据。

对此的任何帮助将不胜感激。

我现在唯一的线索是可能存在阻止遍历父目录的“获取”请求的安全威胁。

谢谢。

代码片段:

function test(){
    var request = new XMLHttpRequest();
    request.open('GET', "../test.txt", true);
    request.send();//FAILS HERE

    //Get Response
    var response = request.responseText;
}

function test2(){
    var request = new XMLHttpRequest();
    request.open('GET', "test.txt", true);
    request.send();
    //Get Response
    var response = request.responseText; //SUCCESSFUL
}

【问题讨论】:

  • 为什么不安装像 Apache/IIS 这样的本地服务器?这将解决您的问题。从安全角度来看,浏览器可能不允许这样做

标签: javascript html xmlhttprequest


【解决方案1】:

来自the MDN website,关于 Gecko 引擎以及 Firefox 浏览器:

只有当源文件的父目录是目标文件的祖先目录时,一个文件才能读取另一个文件。

其他浏览器也存在类似的规则。这是file:/// 协议的限制。它的存在是有充分理由的。试图打破它是没有意义的。解决方案是在您的计算机上运行本地服务器,这甚至不难。

澄清一下:假设您有这样的文件结构:

- file1.html
- dir1/
  - file2.html
- dir2/
  - index.html
  - file3.html
  - dir3/
    - file4.html

index.html 中,您可以使用Javascript 访问file3.htmlfile4.html。它无法访问file1.htmlfile2.html

【讨论】:

  • 首先,链接不再有效。其次,如果我想将包含 a/b/.. 的 URL 发送到后端,但由于 .. 而仅作为 a/ 发送,则此答案无济于事
  • @ElectRocnic 为什么要发送a/b/..?这意味着 a/:这就是URI 的工作方式。 (可惜链接已损坏:我想知道信息现在是否已过时。无论如何,我认为这与您的问题无关,因为它听起来不像您使用的是 file:/// URI。)
  • 是的,我使用的是普通的 http 请求 URL。我不想回答你的问题,但我们的代码允许这样做,我们正在寻找一种方法将.. 按原样传递到后端。即使使用%2e%2e,浏览器似乎也应用了路径遍历,而不是仅仅将 URL 作为字符串传递。
【解决方案2】:

使用file->open直接在浏览器中打开文件,然后复制地址栏中的URL。

【讨论】:

    猜你喜欢
    • 2011-01-29
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多