已经用spring boot版本2.5.3构建了一个JAVA项目.

由于"Spring4shell"(CVE-2022-22965)的安全风险,我们必须采取缓解措施.

无法升级Spring启动版本,因为其他几个依赖项与最新的Spring启动版本不兼容.

根据指南,建议采取两种变通方法.

  1. 通过@ControllerAdvice方法在WebDataBinder上设置不允许的字段
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {

    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
         String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
         dataBinder.setDisallowedFields(denylist);
    }

}
  1. 扩展RequestMappingHandlerAdapter以更新WebDataBinder:
@Bean
    public WebMvcRegistrations mvcRegistrations() {
        return new WebMvcRegistrations() {
            @Override
            public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() {
                return new ExtendedRequestMappingHandlerAdapter();
            }
        };
    }


    private static class ExtendedRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter {

        @Override
        protected InitBinderDataBinderFactory createDataBinderFactory(List<InvocableHandlerMethod> methods) {

            return new ServletRequestDataBinderFactory(methods, getWebBindingInitializer()) {

                @Override
                protected ServletRequestDataBinder createBinderInstance(
                        Object target, String name, NativeWebRequest request) throws Exception {
                    
                    ServletRequestDataBinder binder = super.createBinderInstance(target, name, request);
                    String[] fields = binder.getDisallowedFields();
                    List<String> fieldList = new ArrayList<>(fields != null ? Arrays.asList(fields) : Collections.emptyList());
                    fieldList.addAll(Arrays.asList("class.*", "Class.*", "*.class.*", "*.Class.*"));
                    binder.setDisallowedFields(fieldList.toArray(new String[] {}));
                    return binder;
                }
            };
        }
    }

这两种方法都已try 过,但都无法拒绝以下请求.

主机:端口/路径?班单元类加载器.URL%5B0%5D=0

我们的方法遗漏了什么?

推荐答案

将值设置为webDataBinder不会拒绝请求.setDisallowedFields().

WebDataBinder提供了两种方法setAllowedFields和setDisallowedFields来设置属性名列表,这些属性名可以在模型对象的数据绑定过程中使用,也可以不使用.

Java相关问答推荐

强制Mockito返回null而不是emtpy list

Java取消任务运行Oracle查询通过JDBC—连接中断,因为SQLSTATE(08006),错误代码(17002)IO错误:套接字读取中断

调用引发泛型异常的泛型方法时出现编译错误

Spring Boot 3.2.2中的@Inject和@Resource Remove

为什么Java Annotation接口覆盖对象类中的方法

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

Com.example.service.QuestionService中的构造函数的参数0需要找不到的类型为';com.example.Dao.QuestionDao;的Bean

用户填充的数组列表永不结束循环

内存和硬盘中的Zip不同,这会导致下载后的Zip损坏

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

使用SWIG将C++自定义单元类型转换为基本Java类型

何时调用密封层次 struct 的switch 中的默认情况

Java嵌套流查找任意值

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

在Java中比较同一多维数组的两个不同的字符串元素

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

java.lang.ClassCastException:com.google.firebase.FirebaseException无法转换为com.google.fire base.auth.FirebaseAuthException

Java方法参数:括号中的类型声明?

URI构造函数错误?

在 Java Spring Boot 中注入而不是实例化抽象类