【问题标题】: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 不正确。任何针对此表进行编码的开发人员都在接触可能非常敏感的数据。

    为了缓解这种情况,如果您正在处理这样的敏感字段:

    1. 实际上将钱包金额存储在单独的表或数据库中
    2. 只有一组非常有限的 API 来调整钱包金额,对其进行广泛测试,并且只在处理钱包金额时使用这些 API

    这意味着您可以将敏感数据与用户表分离,并允许您隔离需要格外小心和注意的域部分。

    如果您想更进一步,请考虑根本不存储钱包金额。对于非常安全的金融系统来说,一种常见的方法是实际存储一个账本,它是每笔交易的不可变记录。在您的情况下,它可能看起来像:

    1. 第 1 天:我在钱包里加了 100 美元
    2. 第 2 天:我花了 10 美元
    3. 第 3 天:我花了 13 美元

    等等。然后,您可以实际设置您的数据库,以便您永远不会改变任何数据,而只会向分类帐添加更多行。缓存可用于跟踪当前余额,但始终可以通过运行分类帐项目来重新创建。这对您的场景来说可能有点矫枉过正,但可以提供额外的保护层,因为您基本上禁止任何人任意更改钱包中的内容,他们只能添加交易(这使得发现可疑行为或模式和跟踪变得更容易)资金流动的地方)。

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多