【问题标题】:Will this create any security exploit?这会产生任何安全漏洞吗?
【发布时间】:2017-05-05 16:49:57
【问题描述】:
我有一个 mongodb 集合“用户”,当用户在他们的钱包中添加资金时,我想在其中添加一个新字段“wallet_amount”。现在在用户注册时,我正在尝试插入这样的文档
db.users.insert( { email: "test@test.com", wallet_amount: 0 } )
这是正确的做法,还是有可能因为我将 wallet_amount 默认值传递为 0 而造成一些安全漏洞?
或者 wallet_amount 只能在用户在钱包中充值时插入。
【问题讨论】:
标签:
javascript
node.js
mongodb
security
【解决方案1】:
理论上,无论您是在用户创建时还是在稍后阶段设置初始金额,都没有安全隐患。
但是,您面临的更普遍的安全问题是每次您对用户表有任何查询,您需要对其进行三次检查以确保它无法更改wallet_amount 不正确。任何针对此表进行编码的开发人员都在接触可能非常敏感的数据。
为了缓解这种情况,如果您正在处理这样的敏感字段:
- 实际上将钱包金额存储在单独的表或数据库中
- 只有一组非常有限的 API 来调整钱包金额,对其进行广泛测试,并且只在处理钱包金额时使用这些 API
这意味着您可以将敏感数据与用户表分离,并允许您隔离需要格外小心和注意的域部分。
如果您想更进一步,请考虑根本不存储钱包金额。对于非常安全的金融系统来说,一种常见的方法是实际存储一个账本,它是每笔交易的不可变记录。在您的情况下,它可能看起来像:
- 第 1 天:我在钱包里加了 100 美元
- 第 2 天:我花了 10 美元
- 第 3 天:我花了 13 美元
等等。然后,您可以实际设置您的数据库,以便您永远不会改变任何数据,而只会向分类帐添加更多行。缓存可用于跟踪当前余额,但始终可以通过运行分类帐项目来重新创建。这对您的场景来说可能有点矫枉过正,但可以提供额外的保护层,因为您基本上禁止任何人任意更改钱包中的内容,他们只能添加交易(这使得发现可疑行为或模式和跟踪变得更容易)资金流动的地方)。