Javascript记录敏感数据

时间:2019-08-08 17:27:00

标签: javascript node.js json object passwords

我正在设置包含从用户接收到的密码的日志记录,并将该对象发布到后端,该密码是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);
  }
  ...

1 个答案:

答案 0 :(得分:1)

您可以在保存之前从对象中剥离password属性:

const safeObject = {
    ...this.userDataObj,
    password: undefined // Or whatever value you want to use, eg "hidden", "removed", etc.
};
winston.info('Posting object: ' + safeObject);

这将创建一个浅表副本,然后覆盖password属性。


这是一种确定哪些属性可以安全记录的“黑名单”方法-IE如果添加了不应记录的新属性,则需要明确覆盖它。


一种替代方法是“白名单”方法-即明确指出哪些属性可以安全记录:

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;