Web services Rest重播攻击/安全性

Web services Rest重播攻击/安全性,web-services,security,rest,jersey,restful-url,Web Services,Security,Rest,Jersey,Restful Url,让我来描述一个简单的场景: 有一个rest资源由以下URI表示:/api/messages/{userid}。用户登录后,将发送一个请求,并将其传递给此URI“userid”(logged user)。这样,一旦用户登录,他就会根据自己的ID获得自己的消息 如果用户尚未登录,则URI不可见(存在身份验证筛选器) 问题是:如果已经登录的用户发现这个uri,他可以提交一个传递另一个ID的请求,这将导致安全问题,因为他将能够从另一个用户那里获取消息(只需传递任意随机ID) 您能否提出任何安全模型来防止

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

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

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

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

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


提前谢谢

让端点(a)只返回登录用户可见的消息,或者(b)如果登录用户与URI中的用户ID相同,则只返回消息。哪一个取决于您的业务规则。

在端点中,您可以检查用户,然后查看该用户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();
    }

}
导入javax.ws.rs.core.Context;
导入javax.ws.rs.core.SecurityContext;
进口布拉布拉布拉;
@得到
@路径(“消息/{userid}”)
公共响应getMessages(@PathParam(“userid”)int userid,@Context SecurityContext Context){
字符串username=context.getUserPrincipal().getName();
int id=getIdFromName(用户名);//自己定义
if(userId==id){
//输出消息列表
List msgs=getDemMessageGurl();//自己定义
返回Response.ok(newgenericentity(msgs){}).build();
}否则{
//禁止输出(403)
返回Response.status(403.build();
}
}

使用oauth,您可以使用servlet过滤器根据oauth符号设置用户主体,然后不只是根据url进行身份验证。使用cookie传递身份验证数据。如果没有cookie,url将毫无用处。您的建议是,在每个将此id传递到服务(业务)层的请求中,在服务器端获取用户id?采用Web服务Rest的一些原则,服务器是完全无状态的,我更愿意将其作为一个交叉概念来实现。我的问题是如何以这种方式实施。@MikeH我看不出我的回答怎么会因为这种担心而无效。您的API必须有某种方式来跟踪发出请求的用户:身份验证头、API密钥等,它将告诉您登录的用户是谁。不需要州政府。如果您这样做(b),您可以让一个过滤器检查用户ID的传入URI,并将其与用户名进行比较。我想这可能是交叉的。@MikeH啊,我明白了,你没有任何方法来跟踪谁登录了。这是一个错误。我强烈建议您不要编写自己的web安全体系结构。使用已经存在的东西:Basic Auth、OAuth 2等。您建议如何使用OAuth 2实现它来解决上述场景?lookazis->