如何防止机密数据被包含在 WebPack 包中
How to prevent confidential data from being included in WebPack bundles
我担心,由于遗漏,包含数据库密码或会话密钥等秘密的模块可能会包含在 WebPack 或 Browserify 包中。
即使我不直接导入这些模块,我也可能不小心从客户端入口点模块间接导入它们。
有没有办法将此类文件列入黑名单,以便那些打包程序拒绝打包它们?尽管人们愿意遵循可以避免此类问题的最佳实践,但拥有这样的安全网会很好。
通过loaders 导入文件时,您可以通过include
和exclude
属性选择将目录列入黑名单或白名单。这些可以是 RegEx 或绝对路径。
一个简单的例子
以下内容阻止任何 JavaScript 文件包含在存在于 ./secret
目录中的包中。
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;
该示例有点复杂,但它应该能让您很好地了解如何执行它。简而言之,循环遍历您的加载程序并根据需要附加额外的 includes/excludes。
奖励:为您的秘密数据指定类型
如果您的代码库中确实存在机密数据,我建议为文件名提供一个类型。例如,如果您的文件名为 sqlconnections.js
,我会将其重命名为 sqlconnections.confidential.js
。然后我会在我的加载程序中添加 exclude /\.confidential\.js$/
的 RegEx 模式。这创建了一个可以在您的代码库中重复使用的约定。
我担心,由于遗漏,包含数据库密码或会话密钥等秘密的模块可能会包含在 WebPack 或 Browserify 包中。
即使我不直接导入这些模块,我也可能不小心从客户端入口点模块间接导入它们。
有没有办法将此类文件列入黑名单,以便那些打包程序拒绝打包它们?尽管人们愿意遵循可以避免此类问题的最佳实践,但拥有这样的安全网会很好。
通过loaders 导入文件时,您可以通过include
和exclude
属性选择将目录列入黑名单或白名单。这些可以是 RegEx 或绝对路径。
一个简单的例子
以下内容阻止任何 JavaScript 文件包含在存在于 ./secret
目录中的包中。
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;
该示例有点复杂,但它应该能让您很好地了解如何执行它。简而言之,循环遍历您的加载程序并根据需要附加额外的 includes/excludes。
奖励:为您的秘密数据指定类型
如果您的代码库中确实存在机密数据,我建议为文件名提供一个类型。例如,如果您的文件名为 sqlconnections.js
,我会将其重命名为 sqlconnections.confidential.js
。然后我会在我的加载程序中添加 exclude /\.confidential\.js$/
的 RegEx 模式。这创建了一个可以在您的代码库中重复使用的约定。