休息重放攻击/安全

时间:2014-06-19 14:17:15

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

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

此URI表示一个rest资源:/ api / messages / {userid}。用户登录后,将调度请求,并传递给此URI" userid" (已登录的用户)。这样,一旦用户登录,他就会根据自己的ID获取自己的消息。

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

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

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

先谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在端点中,您可以检查用户,然后查看该用户ID是否与pathparam匹配 从用户名中查找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 signiture设置用户主体