为了账号安全,请及时绑定邮箱和手机立即绑定

ServletRequest::setAttribute 在 Web 服务安全方面是否安全?

ServletRequest::setAttribute 在 Web 服务安全方面是否安全?

米琪卡哇伊 2022-06-30 19:15:46
精简版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属性。@RestControllera的方法示例:@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();}我的问题是:这种形式的身份验证安全吗?我的意思是,ServletRequestJava 中唯一添加和使用的属性是用于方法之间的通信,还是可以在到达服务器之前将它们添加到请求中?这种身份验证方式是否使用Filter良好的做法来避免重复代码?附加说明这样做的真正原因不仅仅是身份验证。我还有Filters 需要处理每个请求并将对象传递给Controllers。我绝对想要的是,即使是知道系统实现的人也不能伪造这些对象和信息。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

我想我已经从文档中找到了答案getAttribute

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

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


查看完整回答
反对 回复 2022-06-30
  • 1 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信