Javascript 记录敏感数据
Javascript logging sensitive data
我正在设置包含从用户那里收到的密码的日志记录,并将此对象发布到后端,密码是 JSON 对象中的一个键。
例如
{
"username": my_username,
"password": my_password
}
我想在 POST 之前捕获此对象,但不想记录密码值。有没有办法不记录密码值?
我正在 constants.js
中创建一个 JSON 骨架,如下所示
constants.js
const userDataObj = Object.freeze({
"username": null,
"occupation": null,
"password": null
})
module.exports = userDataObj;
然后在我的 routes.js
中将其发布到后端。
firemanRoutes.js:
import userDataObj from '../../config/constants';
...
//initialize stuff in the constructor and set constants
constructor(socketProvider) {
super(socketProvider);
this.userDataObj = JSON.parse(JSON.stringify(userDataObj));
this.userDataObj.occupation = 'fireman';
}
// get the passphrase and post object
validate(res, user, passphrase) {
this.userDataObj.passphrase = passphrase;
// want to log object here **without** password
winston.info('Posting object: ' + this.userDataObj);
validateUser.post(user, this.userDataObj).then(() => {
if (!validateUser.getSuccess()) {
return super.handleErrors(res);
}
...
您可以在保存前从对象中删除 password
属性:
const safeObject = {
...this.userDataObj,
password: undefined // Or whatever value you want to use, eg "hidden", "removed", etc.
};
winston.info('Posting object: ' + safeObject);
这会创建一个浅拷贝,然后覆盖 password
属性。
这是一种决定哪些属性可以安全记录的 "blacklist" 方法 - IE 如果您添加一个不应记录的新 属性,则需要明确覆盖它。
另一种方法是 "whitelist" 方法 - 即明确说明哪些属性可以安全记录:
const safeObject = {
this.userDataObj.username,
this.userDataObj.occupation,
this.userDataObj.passphrase
};
winston.info('Posting object: ' + safeObject);
这里的好处是,如果您添加一个新的 属性,除非您明确说明,否则它不会被记录。我提到这个是因为 passphrase
属性 当前正在记录,但我不确定这是有意还是无意。如果是偶然的,那么这个方法就可以避免这个错误。
如果扩展运算符 (...
) 不可用,您可以使用 Object.assign
:
获得相同的行为
const safeObject = Object.assign({}, this.userDataObj);
safeObject.password = undefined;
我正在设置包含从用户那里收到的密码的日志记录,并将此对象发布到后端,密码是 JSON 对象中的一个键。
例如
{
"username": my_username,
"password": my_password
}
我想在 POST 之前捕获此对象,但不想记录密码值。有没有办法不记录密码值?
我正在 constants.js
中创建一个 JSON 骨架,如下所示
constants.js
const userDataObj = Object.freeze({
"username": null,
"occupation": null,
"password": null
})
module.exports = userDataObj;
然后在我的 routes.js
中将其发布到后端。
firemanRoutes.js:
import userDataObj from '../../config/constants';
...
//initialize stuff in the constructor and set constants
constructor(socketProvider) {
super(socketProvider);
this.userDataObj = JSON.parse(JSON.stringify(userDataObj));
this.userDataObj.occupation = 'fireman';
}
// get the passphrase and post object
validate(res, user, passphrase) {
this.userDataObj.passphrase = passphrase;
// want to log object here **without** password
winston.info('Posting object: ' + this.userDataObj);
validateUser.post(user, this.userDataObj).then(() => {
if (!validateUser.getSuccess()) {
return super.handleErrors(res);
}
...
您可以在保存前从对象中删除 password
属性:
const safeObject = {
...this.userDataObj,
password: undefined // Or whatever value you want to use, eg "hidden", "removed", etc.
};
winston.info('Posting object: ' + safeObject);
这会创建一个浅拷贝,然后覆盖 password
属性。
这是一种决定哪些属性可以安全记录的 "blacklist" 方法 - IE 如果您添加一个不应记录的新 属性,则需要明确覆盖它。
另一种方法是 "whitelist" 方法 - 即明确说明哪些属性可以安全记录:
const safeObject = {
this.userDataObj.username,
this.userDataObj.occupation,
this.userDataObj.passphrase
};
winston.info('Posting object: ' + safeObject);
这里的好处是,如果您添加一个新的 属性,除非您明确说明,否则它不会被记录。我提到这个是因为 passphrase
属性 当前正在记录,但我不确定这是有意还是无意。如果是偶然的,那么这个方法就可以避免这个错误。
如果扩展运算符 (...
) 不可用,您可以使用 Object.assign
:
const safeObject = Object.assign({}, this.userDataObj);
safeObject.password = undefined;