如何防止机密数据被包含在WebPack捆绑包中

7
我担心在 WebPack 或 Browserify 的 bundle 中,由于疏忽,可能会包含包含数据库密码或会话密钥等秘密的模块。

即使我不直接导入这些模块,我也可能会从客户端入口模块间接导入它们。

是否有一种方法可以将这些文件列入黑名单,以便这些打包工具拒绝对它们进行打包? 即使我们尽力遵循最佳实践来避免此类问题,有这样一个安全网还是很好的。
1个回答

4
通过加载器导入文件时,您可以通过includeexclude属性选择要将哪些目录列入黑名单或白名单。这些可以是RegEx或绝对路径。

一个简单的例子

以下代码阻止了任何存在于./secret目录中的JavaScript文件被包含在捆绑软件中。
 var path = require('path');
        module.exports = {
          // Configuration omitted for brevity
          module :{
            loaders : [
                { 
                  test: /\.js$/, 
                  loader: "script",
                  exclude : path.resolve(__dirname, './secret')  // Exclude secret directory
                },
                { 
                  test: /\.css$/, 
                  loader: "style!css" 
                }
            ]
          }
        };

适用于所有加载程序的复杂示例应用过滤器

如果您希望防止从./secret目录中的文件被意外导入,并且仅允许包含src的文件,则可以执行以下操作。

var path = require('path');
var blackList = [ path.resolve(__dirname, './secret') ];
var whiteList = [ /src/ ]; // Allow only directories containing "src"

var config = { 
...
/// Webpack configuration
};

// Apply whitelisting and blacklisting for all loaders
config.module.loaders.forEach(function(loader)
{
   loader['exclude'] = [...(loader['exclude'] || []), ...blackList];
   loader['include'] = [...(loader['include'] || []), ...whiteList];
});

module.exports = config;

这个例子有点复杂,但它应该能给你一个好的想法如何执行它。简而言之,循环遍历你的加载器,并根据需要附加其他包含/排除。

奖励:为您的机密数据提供类型

如果您的代码库中存在机密数据,我建议为文件名提供一个类型。例如,如果您的文件名为sqlconnections.js,我会将其重命名为sqlconnections.confidential.js。然后我会将一个exclude正则表达式模式/\.confidential\.js$/添加到我的加载器中。这创建了一个可以在您的代码库中重复使用的约定。


好的,谢谢你的发现 :) 不过你会自己做这个吗?只是想知道一下常见的做法。 - Gui Prá
我不能说我在实际中见过这种情况,但大多数现有的示例并没有真正涵盖您的具体问题。此外,大多数代码库往往不包含机密数据,而是依赖其他构建过程将其添加到生产构建中。我已更新我的答案,包括有关机密数据的一般建议。 - cgatian
如果打包构建过程没有访问任何敏感数据,那么问题就解决了。我知道这不是理想情况,但我认为对于许多人,尤其是小团队的人来说,在本地机器上构建生产捆绑包并不太罕见。 - Gui Prá
1
我绝对可以看到这种情况的发生。特别是当人们在全球范围内使用他们的资源时。这是一个很好的问题,希望它能得到一些赞同票 :) - cgatian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接