Node的Browserify是否绕过了Javascript的沙盒?

时间:2016-01-04 04:20:19

标签: javascript node.js security browserify sandbox

我还没有真正掌握Node的Browserify模块可以做的所有事情,但是很明显你可以在节点上编写函数,例如包括文件系统操作,可以在客户端访问。

更具体地说,如果我们有以下节点代码,

window.readFile=function(){
fs.readFile(dir+file, "utf-8", function (err, data) {
    var dataString;     
      if (err){
        throw err;
      }
      if (data){
        dataString = data.toString('utf8');
      }
    console.log(dataString);
    return dataString;
});
}

我们猜测了目录和文件名,甚至通过基本目录解析并输出了所有内容(在节点中很容易做到),然后我们在文档加载时简单地调用readFile / strong>,这不会绕过所有的浏览器安全,以确保恶意脚本不会访问您的文件系统,或者我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:2)

没有。 Browserify只是可以在浏览器上下文中使用require - 样式依赖项。并非在Node中服务器端工作的所有东西都在客户端工作(没有修改或没有语义差异)。对于fs模块,您不能按原样使用常规模块,但必须使用浏览器将其替换为browserify-fs,并且不会让您对用户进行任意访问文件系统;相反,它会为您提供一个类似文件系统的API,用于在浏览器中存储数据,但您只能使用它来读回您之前在同一网站上编写的文件。

我不知道browserify-fs中的特定实现(该网站声称它使用自己的基于LevelDB的数据库,但没有说明存储此数据库的基础数据的位置)但从历史上看,已有多个用于客户端存储的浏览器API,包括WebSQL(已弃用),IndexedDBFileSystem API(非标准)。多年来有各种各样的填充物(例如idb.filesystem.js),它们在较低级别的存储上提供类似文件的操作。

答案 1 :(得分:1)

如果在browserify中包含standard-lib模块,则它不会包含节点安装中的副本,而是a copy browserify includes specifically for the browser

话虽这么说,fs模块是no-op in browserify有几个原因,安全性就是其中之一(以及浏览器的文件访问方法不会覆盖与节点相同的空间#39; s。。)对于像child_process,module,net,dgram等模块也是如此 - 在浏览器环境中没有简单(或有时可能!)的翻译。

如果您需要在浏览器中从磁盘访问文件,则会有一个browserify转换brfs,它将包含来自文件AT COMPILE TIME的数据作为捆绑包中的静态字符串。