【发布时间】:2015-05-16 02:39:07
【问题描述】:
让我们想象一个问题: 我有一个 REST 服务,它是使用 Java/MySQL/Spring 和 HTTP/JSON 技术实现的。 REST 服务的客户端是移动应用程序。 所以很有可能有人会反编译代码,得到REST服务的API。 (是的,代码被混淆了等,但无论如何)。
问题:有一个 POST 方法可以向应用程序的其他用户汇款。 我很担心,有人可以获得 API,编写一个机器人,然后每秒发出 500 或 5,000 甚至 50,000 次 POST 请求。 结果,他发送的钱可能比他实际拥有的多,因为如果同时处理 1000 个请求,那么余额检查可能是 所有 1000 个请求都成功,但是帐户上的实际金额可能仅够 50 个请求。
因此,基本上,它更像是具有多个线程的标准“竞争”条件。 问题是,我有多个服务器,无论如何它们彼此无关。 所以,300个请求可以到达服务器A,300个请求可以到达服务器B,其余请求可以到达服务器C。
我最好的办法是使用“SELECT ... FOR UPDATE”之类的东西并在数据库级别进行同步。 不过,我想考虑另一种解决方案。
有什么想法或建议吗?
【问题讨论】:
-
您没有登录、会话和反 csrf 令牌来确保传输请求只能来自已登录的授权用户吗?您是否没有授权检查以确保仅尊重转移自己资金的请求?你不是有一个三层应用程序,所以前端只处理表示层,而业务逻辑在幕后处理?您是否无法在单个业务逻辑服务器中对类似请求(相同的捐赠者、相同的目标等)进行分段处理?
-
登录/会话如何防止这种情况?如果有人破解 API,他可以破解登录/会话并使用有效的身份验证机制发送此请求。顺便说一下,身份验证是基于令牌的,即 OAuth。这是一个 REST 服务,我不使用 csrf 令牌。
-
如果您让人们登录并限制某些东西,使人们只能花费自己的钱,那么您可以防止攻击者花费别人的钱的攻击。这并不能防止他们透支自己的帐户,但确实可以防止他们透支别人的帐户。
-
您可能还想调查透支费用,就像银行一样...
标签: java rest race-condition