XMLHTTPRequest以chrome扩展名加载本地文件

时间:2018-09-07 05:48:10

标签: javascript google-chrome google-chrome-extension xmlhttprequest

因此XMLHttpRequest不应该为网站加载本地文件。如果一个人实际上可以通过JavaScript获得对用户文件系统的访问权限,那将是一个疯狂的安全风险。

但是无论出于什么原因,当我使用XMLHttpRequest以chrome扩展名加载本地文本文件时,它都可以工作。 为什么在后台脚本中将XMLHttpRequest用于chrome扩展时会加载文件?这是安全性漏洞还是故意的?难道这不会像请求在网页中加载本地文件那样产生类似的安全风险吗?

让我尝试以最好的方式对此进行解释:

我有一个名为abc.txt的文本文件,我想打开它并通过JavaScript读取文件内容,所以我决定使用XMLHttpRequest。

<!DOCTYPE html>
<html>
<body>
<script>
</script>
  <script>
    let txt = '';
    let xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function(){
        if (xmlhttp.status == 200 && xmlhttp.readyState == 4){
                txt = xmlhttp.responseText;
                console.log(txt)
            }
    };
    xmlhttp.open("GET", "abc.txt", true);
    xmlhttp.send();
  </script>
</body>
</html>

我得到了常见错误test.html:17 Failed to load file:///C:/Users/none/of/your/business/abc.txt: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

但是,当我进行Chrome扩展时,我可以通过background.js脚本加载本地文件。

manifest.js文件:

{
    "name": "Question",
    "version": "1.0",
    "manifest_version": 2,
    "background": {
        "persistent": true,
        "scripts":["background.js"]
    }
}

background.js文件:

chrome.runtime.onInstalled.addListener(function() {
    let txt = '';
    let xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function(){
        if (xmlhttp.status == 200 && xmlhttp.readyState == 4){
                txt = xmlhttp.responseText;
                console.log(txt)
            }
    };
    xmlhttp.open("GET", "abc.txt", true);
    xmlhttp.send();
});

证明已加载文本文件: enter image description here

要重申我的问题,为什么XMLHttpRequests对Chrome扩展程序的background.js脚本有不同的对待?它是否会产生与在网页上具有XMLHttpRequests类似的问题?

注意:XMLHttpRequest似乎只能在background.js文件中工作,当我将文件链接到HTML文档的那一刻,它停止运行并收到正常的错误消息。所以我不能在弹出的html文件上运行它。

1 个答案:

答案 0 :(得分:0)

正如Deliaz所说,答案是chrome允许CORS请求。