【问题标题】:Javascript logging sensitive dataJavascript 记录敏感数据
【发布时间】:2019-12-16 11:28:08
【问题描述】:

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

【问题讨论】:

  • 好吧,我们可以看看你的代码吗?哪个功能负责这样做?日志是怎么做的?
  • @CalvinNunes 添加
  • winston.info('发布对象:' + this.userDataObj.username + " " + this.userDataObj.occupation); ........这就是你要问的吗?

标签: javascript node.js json object passwords


【解决方案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;

【讨论】:

  • 谢谢,这个答案正是我想要的!
  • 有什么方法可以在winston 级别执行此操作,而不必在记录之前从对象中删除属性?
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 2020-05-01
  • 2016-02-13
  • 1970-01-01
  • 2010-11-02
  • 2020-04-21
  • 2020-06-19
相关资源
最近更新 更多