保护REST API用户创建的最佳实践

4

我目前正在一个iPhone/Android项目上工作,移动端通过REST API调用与Java后端服务器通信。

Java后端使用Spring和其认证系统实现(带有JSESSION ID令牌)。

虽然我不是安全方面的专家,但我能看到如果没有正确实施可能会出现很多问题。

我的最大担忧之一就是用户创建。例如,当应用程序创建用户时,它只需向(url.com/rest/create)发出POST请求即可。

如何在服务器端避免恶意用户将此URL放入循环中并创建数千个用户?

保障API调用的常规最佳实践是什么?Spring认证令牌是否足够?

谢谢!


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Ralph
该应用程序有一个简单的注册表单,非常简单:用户名、密码和电子邮件字段。所以我不需要任何特殊权限。我只是好奇如何避免(或至少使其复杂化),让手动发布到创建用户URL的人陷入无限循环? - Johny19
2个回答

2

防止客户端向服务器发出大量请求并不是一件容易的事情。恶意用户可以创建脚本或应用程序向您的服务器发送请求。

解决方案是对服务器调用进行身份验证和授权。您可以赋予某些用户(例如管理员)创建用户的特权,并信任这些用户以正确的方式行事。在调用服务器上的API之前,您要求用户进行身份验证。然后,在服务器端,您检查用户是谁以及他/她被允许做什么。

如果您仍然担心有特权用户不会表现得很好,您可以为每个用户分配配额以限制他们可以执行的操作。


谢谢您的回答,但是对于我的应用程序(如Facebook应用程序或任何允许用户创建新帐户的应用程序),不是管理员创建帐户,而是用户自己创建。如果这不可能,那么阻止一个在一秒钟内向URL发出太多调用的用户是否由后端应用程序处理?还是它是Tomcat设置? - Johny19
如果我理解正确的话,您担心有人在循环注册新账户用于您的Web应用程序。这将很难可靠地防止,因为您可能有许多不同的用户来自例如相同的IP地址(在公司代理或其他情况下)。我对Tomcat并不是非常熟悉,但我认为您需要在应用程序本身中构建缓解措施。 - MvdD

1

高科技解决方案(尽可能多地使用框架功能)应该是:

  • 首先:在您想要保护的实体上添加创建者和创建日期字段(我建议使用Spring-Data-JPA审计来完成)。
  • 第二:创建一个自定义的Spring方法(或Web)表达式方法,能够检查当前用户在(例如)最近10分钟内创建了多少项,并且如果这些项超过(例如)20个,则返回false(或将它们作为方法的参数)。

然后,您可以使用该表达式保护您的方法(或URL)(@PreAuthorize("createsNotExeced(10, 20)")

但这是一种高科技解决方案 - 当您想学习Spring安全性时,实现它会非常有趣。(您还需要添加一些缓存,但这也是Spring的一个功能。)


低技术解决方案是:在用户会话中放置一个时间戳列表,并在用户创建新项目时向该数组添加新项目。当最后(例如)20个时间戳条目在最近(例如)10分钟内时,抛出TooMuchHeavyUseRuntimeException或其他异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接