你的 SaaS 正在流失资金

大多数开发者在发布 SaaS 后就撒手不管了。他们把安全视为以后才需要处理的任务。他们等待真实用户或真实资金的到来。

真正的财务损失往往源于简单的错误。这些并不是复杂的黑客攻击,而是你代码中的逻辑错误。

以下是导致你亏钱的四种常见方式:

  1. 积分系统的竞态条件 (Race Conditions) 你读取用户余额,进行检查,然后写入新余额。如果用户同时发送两个请求,在第一个请求更新数据库之前,两个请求都可能通过检查。你只收了一份钱,却提供了两次服务。

修复方法:使用原子数据库操作 (atomic database operations)。不要先读取再写入,而是使用单条命令,仅在用户有足够积分时才更新余额。

  1. 信任客户端输入的身份信息 你在结账过程中从请求体 (request body) 中获取电子邮件地址。一个已认证的用户可以将该电子邮件更改为他人的地址。这允许他们为错误的账户创建账单会话,或者探测你的系统。

修复方法:永远不要信任来自请求体的身份信息。应从服务器上经过验证的 session token 中提取电子邮件。

  1. 错误的年度账单逻辑 许多开发者通过监听 Stripe 支付事件来重置用户积分。这对于月度计划有效,但对于年度计划却会失效。Stripe 每年只发送一次事件。你的用户在第一天获得了积分,但在接下来的十一个月里什么也得不到。

修复方法:将积分重置与账单事件解耦。使用每日 cron job,根据重置日期检查哪些用户需要重置。

  1. 不安全的 Token 存储 你将密码重置 token 存储在 localStorage 中。页面上的任何脚本都可以访问 localStorage。这包括浏览器扩展和第三方分析工具。

修复方法:使用你的身份验证 SDK 来处理恢复 token。让库自动处理 token,而不要将其存储在 localStorage 中。

问题始终如一:你信任了客户端。你相信请求会一个接一个地到达。你相信账单事件涵盖了所有情况。

修复这些问题不到一天时间。在亏钱之前,请审计你的代码。

来源:https://dev.to/manolito99/your-saas-is-probably-leaking-money-right-now-and-you-dont-know-it-1g38