2

我们希望实现一个集成在我们的软件(用 java 编写)中的公共 RESTful API,它可能被各种客户端用来构建小型电子商务应用程序(例如,用于 Android 或 iPhone)。此 API 包括获取产品列表、类别、购物车支持等。

我们需要提供一个允许用户注册和其他一些敏感功能的 API。我们应该如何保护这个 API 免受垃圾邮件和暴力破解?在我们使用的标准产品中reCAPTCHA。REST 对应的任何替代方案?

4

1 回答 1

1

首先,考虑关注点分离。REST API 的目的是什么?

REST API 应该为客户端提供服务。客户端通过 REST 协议发送请求,并获得其请求的响应。在代码中,这看起来像:

@GET
public Response getClientInfo(@QueryParam("clientId") Integer clientId) {
     ClientDTO clientDTO = database.getClientInfo(clientId);
     return ResponseWrapper.wrap(clientDTO);
}

现在,您希望您的 REST 方法仅执行此操作而不执行其他操作。否则,您会将块暴力和垃圾邮件逻辑放入您的 REST 方法中,并且您会得到一堆不可扩展、难以版本化等的代码。如果您想更改您的例如黑名单策略,您会必须更改每个 REST 方法,而且它很笨重。如果您想在使用 REST 方法之前检查调用,请查看过滤器。每个请求和响应都通过一系列过滤器,并且可以检查服务器是否被滥用。

我不知道您的技术堆栈是什么,但我建议您研究一下:

  • JBoss AS7。
  • DeltaSpike(使您能够在执行 REST 方法之前检查用户权限和执行权限的强大拦截器)。

例如:

@LoggedInUser
@GET
public Response getClientInfo(...) {
    ...
}

这个安全注释@LoggedInUser(顺便说一下,你定义的)会给拦截器签名以检查这个安全约束,例如

@Secures (built in annotation)
@LoggedInUser
public boolean hasRight(Identity identity) {
    return identity.isLoggedIn(); //or if he is in certain group of users
}
  • 上下文和依赖注入上下文(用于 DeltaSpike)。
  • JBoss 过滤器(一个过滤器链,您可以在其中创建自己的过滤器,例如,检查某个 IP 是否尝试在很短的时间内发送多个调用 ~ 10 行代码)。

过滤器示例

@Startup
@ApplicationScoped
@Filter(around= "org.jboss.seam.web.ajax4jsfFilter")
public class IPTrackerFilter extends AbstractFilter {

    //IPTracker is your @ApplicationScoped bean that remembers all IP addresses accessing the application.
    @Inject
    private IPTracker fIPTracker;

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        if (!(req instanceof HttpServletRequest)) {
            chain.doFilter(req, res);
            return;
        }

        final String ipAddress= ((HttpServletRequest)req).getRemoteAddr();
        if (fIPTracker.isBlackListed(ipAddress)) {
            //implement error message here
            sendErrorMessage(response);
            return;
        } else {
            //all good, continue
            chain.doFilter(req, res);
        }
    }
}

PS。我给了你DeltaSpike的链接,因为其他人真的很容易找到。此外,如果您发现 DeltaSpike 难以理解,请尝试使用JBoss Seam 安全框架

于 2013-06-21T08:47:08.383 回答