【问题标题】:Rest Replay Attacks / Security休息重放攻击/安全
【发布时间】:2014-06-19 14:17:14
【问题描述】:

让我描述一个简单的场景:

这个 URI 代表了一个休息资源:/api/messages/{userid}。用户登录后,将发送一个请求并传递给此 URI “userid”(登录用户)。这样,一旦用户登录,他就会根据自己的 ID 获得自己的消息。

如果用户尚未登录,则 URI 不可见(存在身份验证过滤器)。

问题是:如果一个已经登录的用户发现了这个 uri,他可以提交一个传递另一个 ID 的请求,这将导致安全问题,因为他将能够从另一个用户那里获取消息(只需传递任何随机 ID)。

您能否提出任何安全模型来防止此安全漏洞? (我认为它更可能是一个跨领域问题)。

谢谢,提前!

【问题讨论】:

  • 那么不要仅基于 url 进行身份验证。使用 cookie 来传达身份验证数据。没有那个 cookie,这个 url 就没有用了。

标签: web-services security rest jersey restful-url


【解决方案1】:

就在我的脑海中,让端点 (a) 仅返回登录用户可见的那些消息,或 (b) 仅在登录用户与 userId 相同时返回消息URI。哪一个取决于您的业务规则。

【讨论】:

  • 您的建议是在每次将此 ID 传递给服务(业务)层的请求时,在服务器端获取用户 ID?采用 Web Services Rest 的一些原则,服务器是完全无状态的,我想将其更多地作为一个横切概念来实现。我的问题是如何以这种方式实现它。
  • @MikeH 我看不出我的回复是如何因这个问题而失效的。您的 API 必须有某种方式来跟踪发出请求的人:身份验证标头、API 密钥等。这将告诉您登录用户是谁。不需要状态。如果您这样做 (b),您可以让过滤器检查 userId 的传入 URI 并将其与用户名进行比较。我想这将是跨领域的。
  • @MikeH 啊,我明白了,你没有有任何方法可以跟踪谁登录了。这是一个错误。我将强烈建议您不要编写自己的网络安全架构。使用已经存在的东西:Basic Auth、OAuth 2 等。
  • 您如何建议使用 OAuth 2 来解决上述场景?
【解决方案2】:

在端点中,您可以检查用户,然后查看该用户 ID 是否与路径参数匹配 从用户名中查找 userid 就像使用数据库中的用户名选择 id 一样简单

import javax.ws.rs.core.Context;
import javax.ws.rs.core.SecurityContext; 
import ... blablabla;

@GET
@Path("messages/{userid}")
public Response getMessages( @PathParam("userid") int userId, @Context SecurityContext context ) {

    String username = context.getUserPrincipal().getName();
    int id = getIdFromName(username); // define this yourself
    if(userId==id) {
        // output the message list
        List<Message> msgs = getDemMessagesGURL(); // define this yourself
        return Response.ok(new GenericEntity<List<T>>(msgs) {}).build();
    } else {
        // output Forbidden(403)
        return Response.status(403).build();
    }

}

使用 oauth,您可以使用 servlet 过滤器根据 oauth 签名设置用户主体

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多