就网络服务安全而言,ServletRequest :: setAttribute是否安全?

时间:2019-02-22 12:47:17

标签: java spring spring-boot security servlets

短版

javax.servlet.ServletRequest的方法setAttribute(<key>, <Object>)仅用作在Java代码中的方法之间传递对象的方法吗?

长版

假设我有一个javax.servlet.Filter实现,可以使用cookie处理所有登录用户的身份验证:

在Spring Boot中

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        Cookie[] cookies = null;
        if (request instanceof HttpServletRequest) {
            cookies = ((HttpServletRequest) request).getCookies();
        }

        Optional<User> user = mySessionAuthMethod(cookies);
        if (user.isPresent()) {
            request.setAttribute("user", user.get());
        }

        chain.doFilter(request, response);
    }
}

然后,我可以避免在所有Web API方法中进行手动身份验证,而只需检查user属性。 @RestController方法的示例:

@RequestMapping(value = "/profile")
@CrossOrigin(origins = {MyProperties.ORIGIN}, allowCredentials = "true")
public ResponseEntity getProfile(HttpServletRequest request, HttpServletResponse response) {
    String user = request.getAttribute("user");
    if (user != null) {
        return myGetProfileResponse(user);
    }
    return myNotLoggedInResponse();
}

我的问题是:

  • 这种身份验证形式安全吗?我的意思是,ServletRequest中的属性仅在Java中添加并用于方法之间的通信吗?在到达服务器之前已经添加到请求中了吗?

  • 使用Filter进行身份验证的一种好方法是避免重复代码吗?

其他说明

执行此操作的真正原因不是 only 身份验证。我也有Filter s,它们需要处理每个请求并将对象传递给Controller s。我绝对希望的是,即使是知道系统实现的人也无法伪造这些对象和信息。

1 个答案:

答案 0 :(得分:0)

我想我已经从documentation of getAttribute

找到了答案
  

可以通过两种方式设置属性。 Servlet容器可以设置属性以使有关请求的自定义信息可用。例如,对于使用HTTPS发出的请求,属性javax.servlet.request.X509Certificate可用于检索有关客户端证书的信息。也可以使用ServletRequest#setAttribute以编程方式设置属性。这样可以在RequestDispatcher调用之前将信息嵌入到请求中。

因此,根据此信息(如果没有丢失的信息),传递自定义对象并知道它们始终由服务器创建应该是完全安全的。