【问题标题】:Is ServletRequest::setAttribute safe in terms of web service security?ServletRequest::setAttribute 在 Web 服务安全方面是否安全?
【发布时间】:2019-02-22 12:47:17
【问题描述】:

短版

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 中添加和用于方法之间的通信,或者它们是否已经添加到请求中在到达服务器之前?

  • 这种使用Filters 的身份验证方式是避免重复代码的好习惯吗?

补充说明

这样做的真正原因不仅仅是身份验证。我还有Filters,它需要处理每个请求并将对象传递给Controllers。我绝对想要的是,即使是知道系统实现的人也不能伪造这些对象和信息。

【问题讨论】:

    标签: java spring spring-boot security servlets


    【解决方案1】:

    我想我已经从documentation of getAttribute找到了答案

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

    所以按照这个(如果没有遗漏信息的话),传递自定义对象应该是完全安全的,并且知道它们总是由服务器创建的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多