【问题标题】:Best practice in securing user creation for a REST API为 REST API 保护用户创建的最佳实践
【发布时间】:2014-12-16 18:55:20
【问题描述】:

我目前正在开发一个 iphone/android 项目,其中 mobile talk ta java 后端服务器通过 REST API 调用。

Java 后端使用 Spring 及其身份验证系统(使用 JSESSION ID 令牌)完成

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

例如,我最关心的一个问题是用户创建。 当应用程序创建用户时,它只需向 (url.com/rest/create) 发出 POST 请求

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

保护 API 调用的常见最佳做法是什么? Spring 身份验证令牌是否足够?

谢谢!

【问题讨论】:

  • 您是否希望只有具有特殊权限的用户才能创建用户,您是否希望避免某些用户(具有该权限)可以创建数千个用户(每分钟)?
  • 该应用程序有一个简单的注册表单,非常简单:用户名、密码和电子邮件字段。所以不,我不需要任何特权。我只是好奇如何避免(或至少使其复杂化)在无限循环中手动发布到创建用户 url 的人?

标签: spring security rest authentication


【解决方案1】:

实际上不可能阻止客户端多次调用您的服务器。恶意用户可以创建脚本或应用程序向您的服务器发出请求。

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

如果您仍然担心特权用户的行为不正常,您可以为每个用户分配允许他们执行的操作的配额。

【讨论】:

  • 感谢您的回答,但我的应用程序(作为 Facebook 应用程序或任何其他允许用户创建新帐户的应用程序)的情况不是管理员创建帐户,而是用户自己。现在,如果这是不可能的。是否停止在后端应用程序中处理的一秒钟内对 URL 进行多次调用的用户。还是tomcat设置?
  • 如果我对您的理解正确,您担心有人正在为您的 Web 应用程序循环注册新帐户。这将很难可靠地防止,因为您可能有许多不同的用户来自例如相同的 IP 地址(在公司代理或其他情况下)。我对 Tomcat 不是很熟悉,但我希望您需要在应用程序本身中为此构建缓解措施。
【解决方案2】:

高科技解决方案(尽可能多的框架功能)是

  • 首先:在您要保护的实体上设置一个 created-by 和 created-date 字段(我建议为此使用 Spring-Data-JPA 审计)。
  • second:创建一个自定义 spring 方法(或 web)表达式方法,该方法能够检查当前用户在(例如)过去 10 分钟内创建了多少项目,如果这超过(例如)20 个,则返回 false(或将它们作为方法的参数)。

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

但这是高科技解决方案 - 当一个人想要学习 Spring Security 时,实施它们会很有趣。 (并且您需要添加一些缓存,但这也是 Spring 功能)。


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

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 2019-11-19
    • 2013-10-23
    • 2018-12-06
    • 2021-06-25
    • 2020-05-29
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多