Chrome 的 `--allow-file-access-from-files` 参数及其安全问题探讨

1,482 阅读2分钟

背景

最近在写 html-export-pdf-cli 这个库,这个库主要是增强 pagedjs-cli,现阶段还在让它从 JS 往 TS 上迁移,里面关于启动浏览器有一个知识点——Chrome 的 --allow-file-access-from-files 参数,具体位置的代码在这里:pagedjs

image.png

介绍 --allow-file-access-from-files

--allow-file-access-from-files 是 Chrome 浏览器的一个启动参数,用于允许从本地文件系统访问其他本地文件系统资源。

详细点解释就是,默认情况下,Chrome 浏览器会禁止网页通过 file:// 协议直接访问其他本地文件系统资源,以防止恶意网页获取用户的敏感信息。但是,在某些情况下,我们需要从本地的一个 HTML 文件访问另一个 HTML 文件,或者在本地测试网页时需要读取其他本地文件系统资源,此时就需要使用 --allow-file-access-from-files 参数。

还是案例清楚,假如我们通过一个 fetch 或者 Ajax 来请求系统资源,假设我们在本地有一个名为 index.html 的 HTML 文件,其中需要通过 ajax 加载一个名为 testdata.json 的本地 JSON 文件。如果我们直接打开 index.html 文件,则可能会出现跨域访问问题:

$.getJSON('file:///C:/Temp/testdata.json')

默认情况下,Chrome 不允许 javascript 与本地文件系统交互。如果您尝试,则会收到以下错误消息:

XMLHttpRequest 无法加载 file:///C:/path/to/C:/Temp/testdata.json。Access-Control-Allow-Origin 不允许 Origin null。

你可能问,平时也用不到哇,是的,他的使用场景是:在新网站的开发和测试阶段,有时您可能需要访问存储在本地文件中的 Json 或 xml 数据。测试站点可以在 Visual Studio、IIS Express 甚至 IIS 下运行。这样就需要访问本地文件了。

如何打破这个限制

Chrome 提供了一个标志,让您可以如下所述打开此功能(请注意,这些步骤适用于 Windows 7-8,但相同的逻辑适用于 Mac OS X)

  • 关闭 Chrome 浏览器(如果打开了多个窗口,请确保关闭所有实例)
  • 转到运行并键入以下命令:chrome.exe --allow-file-access-from-file
  • 按回车

对于所有使用 Mac 的同学(包括我在内,因为我正在我的 Mac Book Pro Retina 上键入此内容),与上面等效的命令是:

  • 运行 Terminal.app
  • 输入 open /Applications/Google\ Chrome.app --args --allow-file-access-from-file

现在您应该能够在您的代码中执行以下操作(下面的代码段)

$(document).ready(function() {
var items = [];

$.getJSON('file:///C:/Temp/testdata.json', .. rest of the code here

安全策略

最好不要这么做,它可以将它们上传到远程服务器。我不知道一些坏人想要哪些文件。重点是不要显示上传危险文件。关键只是为了表明如果您禁用网络安全,则您自己或第三方的脚本可以访问您的本地文件。

你们中的许多人会想“我永远不会做其中任何一个”,但我认为这是短视的。我知道我经常忘记我在使用哪个浏览器,开发浏览器还是非开发浏览器。如果我错误地使用了禁用网络安全的开发者,那么哎呀。

因为更好的解决方案是如此简单。只需运行一个简单的本地服务器!最多需要 2 分钟

参考