我们希望在我们的软件(用java编写)中集成一个公共RESTful API,可以被各种客户用来构建小型电子商务应用程序(例如Android或iPhone)。此API包括获取产品,类别,购物车支持等列表。
我们需要提供一个API,允许用户注册和其他一些敏感功能。我们应该如何保护此API免受垃圾邮件和暴力攻击?在标准产品中,我们使用reCAPTCHA
。 REST对应的任何替代方案?
答案 0 :(得分: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方法中加入 block-bruteforce-and-spam-logic ,你会得到一堆不可扩展,难以版本等的代码。如果你想改变你的,例如黑名单政策你必须改变每一种REST方法,而且它很笨重。如果要在使用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
}
过滤器的一个例子
@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 Security Framework。