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;