我有一个要求(待定),允许用户购买“信用”,然后将这些信用交易为真正的商品或服务。
这是我第一次在应用程序中这样做,我担心它会在我的数据库后面画一个目标。黑客可以(从理论上)改变用户的信用额度,然后“花掉”这些信用额度,或者将它们转换为现金。
我正在用ruby/rails构建解决方案,但我并不局限于这项技术。如果更实用的话,我甚至可以使用外部提供商。
有没有人对如何做到这一点有什么建议?你会加密你的数据库吗?这样就足够了吗?
发布于 2015-01-20 08:11:18
有很多不同的事情需要考虑。当谈到安全问题时,从来没有灵丹妙药(任何人都认为这可能是在兜售蛇油);相反,安全通常涉及许多不同的步骤来减轻和管理风险,以及多余的保护层,以便在这些层的某个子集因任何原因失败时仍然受到保护。
在存储货币交易方面,通常需要遵循许多法律法规,因此我建议除了其他安全措施外,还应咨询这些法规。在加密数据库方面,有许多不同的方法来应用加密...可以使用不同的密钥将数据库作为一个整体或单独的行进行加密。如果只是将数据库作为一个整体进行加密,那么如果有人有权访问密钥(这也回避了谁拥有密钥、密钥存储在哪里等问题),它将不会为您提供太多保护。除了数据库本身之外,您可能还想要一个带有某种校验和的事务的只写日志,这样您就可以确保它的真实性,从而为您提供独立于数据库的审计跟踪(在发生某种破坏的情况下,可以从该跟踪重建数据库)。此外,您还需要确保只有经过授权的应用程序(如前端服务器的生产实例)才能与数据库通信并对其进行解密(并确保只有您信任的有限数量的人可以部署这些应用程序的新版本,这样就没有人可以任意部署滥用该访问权限的恶意版本)。如果可以使用不同的密钥对单独的行进行独立加密(例如,使用从用户的登录凭据派生的密钥材料对每个用户的行进行加密),那么这种做法是非常可取的(尽管这样做并不总是可行的,例如,如果您需要能够处理该行,即使用户没有与您的应用程序进行主动交互)。我相信还有其他我没有想到的事情,这就是为什么你还想定期进行渗透测试来检查任何漏洞(不仅修复你以这种方式发现的任何东西,而且还用它来通知项目或流程,以防止将来出现类似的漏洞)。
除了安全性方面的考虑之外,货币事务是少数几种“最终一致性”不起作用的情况之一;您需要确保在编程时小心,使事务适当地原子化。也就是说,您不希望信用额度在与美元退还的单独时间步长减少,因为这将允许相同的信用额度被花费两次……你需要在你的编码中非常小心,以确保信用的减少和美元的增加(反之亦然)同时发生。出于这个和其他原因,彻底的测试和良好的代码审查实践是一个好主意。
https://stackoverflow.com/questions/28035576
复制相似问题