为什么即使 HTML 文档也在本地文件系统上,浏览器也不允许从本地文件系统访问文件?

信息安全 网页浏览器 http javascript 科尔斯
2021-08-26 21:51:08

许多浏览器不允许您使用 JavaScript 访问本地文件系统上的文件(即使 HTML 文档也在本地文件系统上)。

来源

是的,我知道解决方案是“安装并使用 HTTP 服务器进行本地开发”,但我不明白为什么需要这样做?允许网页访问本地文件系统显然是可怕的,但是从本地文件系统访问本地文件系统的风险是什么?

每当我运行 shell 脚本时,我都会这样做,并且 shell 脚本不会阻止我运行cat. 如果我从本地文件系统运行任何东西(无论是任意可执行文件、我自己编译的可执行文件,还是包含 HTML 或 JS 文档的解释脚本!),我得到它的方式我应该知道我的正在运行。为什么 JS 脚本可以在不受此假设影响的浏览器中运行?如果我有从本地文件系统不小心运行恶意软件的习惯,除了打开 HTML 文档之外,我很容易以多种方式搞砸自己。

另外:CORS不应该禁止跨域资源加载吗?据我了解,从本地文件系统资源请求本地文件系统资源几乎不是cross-origin,而是同源,所以我不明白 CORS 为什么会抱怨。

最重要的是,是否需要我为本地开发运行 HTTP 服务器来改进什么?这样做需要我在 localhost 上不必要地打开一个端口。显然,这可以通过阻止外部世界与我的本地服务器通信的方式来完成(拒绝传入连接还不够吗?)但是如果我不需要,为什么要打开侦听端口呢?

我在这里不明白什么?

编辑:再想一想,我确实看到了一个原因。浏览器允许用户在本地保存网页。能够以一种不会损坏本地系统的方式打开此类网页,而不是从 Internet 加载同一网页,这将是有意义的。

3个回答

我将在此处提取一篇关于攻击的旧文章,该文章使用主机上的已知图像位置来映射网络以进行攻击(从 2006 年开始):

https://www.cnet.com/news/javascript-opens-doors-to-browser-based-attacks/

最初,JavaScript 比现在拥有更多的系统访问权限,但随着时间的推移,拥有广泛允许的 javascript 代理的价值使攻击对端点的可见性超出了应有的水平。如果您允许您的浏览器浏览您的所有文件,即使您只是在观看驯服的猫视频,攻击者也可以从您的浏览器中启动恶意软件。哎呀。

随着系统的进步,我想 JavaScript 将继续保持相当有限的访问级别,因为过去造成的开放访问问题。正如微软最近宣布的 JavaScript zeroday 所表明的那样,这是一件相当大的事情,导致公司在 JavaScript 库可以执行之前就将其删除。

现在,您会注意到我已经将大量精力放在 JavaScript 上,正是因为 JavaScript,这才是真正的问题。HTML 本身当然是良性的,但是一旦您打开一个脚本块,您就打开了一罐需要保留的蠕虫。

最后,浏览器不支持此功能的原因是它不是 99% 的用户真正需要的功能。网络浏览器并非旨在成为网络服务器,而只是一个客户端。构建服务器类型的功能会使浏览器膨胀,这是所有浏览器都试图实现的相反功能(轻量级、快速、资源贫乏)

也就是说,随着浏览器模型的日益开放(微软正在采用 Chrome),我猜你可以尝试编写一个包含此功能的模块,我进一步猜测会有一些开发人员会很高兴。你只需要看看那个利基市场是否真的想要一个不需要安装 apache、iis 或 nginx 的本地服务器。

如果 HTML 页面中的 JavaScript 在文件系统上打开时可以访问内容文件系统,那么它可以轻松地将该数据上传到网络服务器。然后,攻击者需要做的就是诱使用户打开下载的 HTML 文档,然后他们就拥有了您的私人数据。

基本上,您必须像对待任何其他可执行文件一样将 HTML 视为潜在危险。这有点类似于.js文件在 Windows 上的可执行方式,这是 Windows 用户最近遇到的一个问题。

但实际上它变得更糟了。想象一下,一些主要的软件供应商在 HTML 文件中包含一些帮助文档,其中存在一些常见的 XSS 漏洞。然后,攻击者只需将用户的浏览器重定向到该页面即可窃取您的数据。现代浏览器可能会阻止自动重定向,但攻击者可能会诱骗人们手动将 URL 粘贴到浏览器中。那么即使只是file:在浏览器中输入一个 URL 也可能是有风险的。

我猜你在写关于 Chrome(ium)

在 CORS 被广泛采用之前,可能有(或曾经有)一些原因不允许访问本地文件系统上的任何文件。

但是现在我认为没有理由不允许在同一目录中或下的访问。不,除了对 file:// 的同源策略的懒惰(或者更确切地说没有)实施之外,绝对没有任何理由。

Firefox 做对了。Chrome 不关心回应。

要访问敏感文件(并返回服务器),这假设您规避了相同的策略和 CORS。

如果在可以写入 html 文件的目录中或目录下有敏感文件,那么您将遇到更大的问题(或者浏览器正在写入不应该写入的位置,或者您的用户是 am*ron(或者系统管理员赋予它太多权限))

很遗憾,Chrome 淘汰了所有 xml+xsl “应用程序”