Java序列化过滤器YiMing

对实体类进行序列化时,控制台有如下警告:

查看官方文档,对其描述如下:

为了提高序列化的安全性和健壮性,Java提供了可筛选序列化对象的传入流的序列化过滤机制。过滤器可以在反序列化输入类之前对其进行验证。

在java中,所谓的序列化即将对象的状态转换为字节流并存储到文件、数据库或发送到网络(当父类实现了标记型接口Serializable或Externalizable子接口,其子类也可序列化)。而反序列化则与上述过程相反,可类比为加密与解密的过程。

序列化用于许多领域,包括远程方法调用(RMI),用于进程间通信(IPC)协议的自定义RMI(例如SpringHTTP调用程序),Java管理扩展(JMX)和Java消息服务(JMS))。当对象的序列化形式转换为该对象的副本时,该对象将反序列化。因此确保此转换的安全性很重要。反序列化的类的readObject方法可以包含自定义代码。可序列化的类(也称为“小工具类”)可以执行任意反射操作。

创建过滤器时,可以指定接受哪些类,拒绝哪些类。也可以在反序列化期间控制对象图(objectgraph)的大小和复杂度,以使对象图不会超出合理的限制。过滤器可以配置为属性,也可以通过编程实现。

除了创建过滤器之外,还可以采取以下措施来防止反序列化漏洞:

在JEP290中,Java序列化过滤机制的目标:

提供一种方法,将可以反序列化的类缩小为适合上下文的类集。

为反序列化期间的对象图大小和复杂度向过滤器提供指标,以验证正常的图形行为。

允许RMI导出的对象验证并调用期望的类。

实现序列化过滤器的方式:

基于模式的过滤器可以接受或拒绝特定的类,程序包或模块。他们可以限制数组大小,图形深度,总引用和流大小(通过黑名单和白名单实现)。而自定义过滤器可以特定于每个ObjectInputStream,在单个输入流或流程中的所有流上设置自定义过滤器。

基于模式的过滤器有一系列模式。每个模式都与流中的类名或资源限定名匹配。可以将基于类的资源限制模式组合在一个过滤器字符串中,每种模式都用分号(;)分隔。

创建此过滤器时,需要注意:

模式之间需要使用分号隔开。

pattern1.*;pattern2.*空格也是模式的一部分。

规则需要放在字符串的第一位。

模式前添加感叹号(!),即为拒绝模式匹配的类。

!pattern1.*;pattern2.*使用通配符(*)以一种模式表示未指定的类.

将基于模式的过滤器定义为一个程序的系统属性,系统属性取代安全属性值。jdk.serialFilter可在命令行中定义system属性。

限制单个程序的资源使用,如下所示:

java-Djdk.serialFilter=maxarray=100000;maxdepth=20;maxrefs=500com.example.test.Application在所有程序中定义基于模式的过滤器将基于模式的过滤器定义为所有程序的系统属性,系统属性取代安全属性值

创建一个全局应用的基于模式的类过滤器。例如,模式可以是类名或带有通配符的包。

过滤器拒绝包(!example.somepackage.SomeClass)中的一个类,并接受包中的所有其他类,如下所示:

jdk.serialFilter=!example.somepackage.SomeClass;example.somepackage.*;如果要拒绝包(!example.somepackage.SomeClass)中的所有类,需要添加(!*):

jdk.serialFilter=!example.somepackage.SomeClass;example.somepackage.*;!*定义资源限制过滤器资源过滤器限制了对象图的复杂性和大小。也可以为以下参数创建过滤器,以控制每个程序的资源使用情况:

基于模式的过滤器用于简单的接受或拒绝,这些过滤器有一些限制:

自定义过滤器是在程序中指定的过滤器。它们在流程中的单个流或所有流上设置。可将自定义过滤器实现为模式,方法,lambda表达式或类。

设置一个自定义过滤器ObjectInputStream,如果要对每个流使用相同的过滤器,则需要设置一个进程范围的过滤器。如果ObjectInputStream没有为其定义过滤器,则将调用全程过滤器。

在对流进行解码时,将发生以下操作:

当流的输入不受信任并且过滤器具有一组有限的要强制执行的类或约束时,可以在单个ObjectInputStream上设置过滤器。例如,可以确保流仅包含数字,字符串和其他程序指定的类型。

自定义过滤器是使用设置setObjectInputFilter方法。必须先设置自定义过滤器,然后才能从流中读取对象。

LocalDateTimereadDateTime(InputStreamis)throwsIOException{try(ObjectInputStreamois=newObjectInputStream(is)){ois.setObjectInputFilter(FilterClass::dateTimeFilter);return(LocalDateTime)ois.readObject();}catch(ClassNotFoundExceptionex){IOExceptionioe=newStreamCorruptedException("classmissing");ioe.initCause(ex);throwioe;}}设置流程范围的自定义过滤器该过滤器适用于ObjectInputStream的每次使用,除非它在特定的流上被覆盖。如果可以确定整个应用程序所需的每种类型和条件,则过滤器可以允许这些类型和条件,而拒绝其余的类型和条件。通常,过程范围的筛选器用于拒绝特定的类或程序包,或限制数组大小,对象图的深度或总大小。

使用ObjectInputFilter.Config类的方法设置一次进程范围的过滤器。过滤器可以是类,lambda表达式,方法引用或模式的实例。

ObjectInputFilterfilter=...ObjectInputFilter.Config.setSerialFilter(filter);在以下示例中,使用lambda表达式设置进程范围的过滤器。

ObjectInputFilter.Config.setSerialFilter(info->info.depth()>10Status.REJECTED:Status.UNDECIDED);在下面的示例中,通过使用方法引用来设置全过程过滤器:

ObjectInputFilter.Config.setSerialFilter(FilterClass::dateTimeFilter);使用模式设置自定义过滤器通过使用ObjectInputFilter.Config.createFilter方法来创建基于模式的自定义过滤器,以方便简单使用。可以将基于模式的过滤器创建为系统属性或安全性属性。将基于模式的过滤器实现为方法或lambda表达式可提供更大的灵活性。

过滤器模式可以接受或拒绝特定的类,包,模块,并且可以限制数组大小,对象图的深度,总引用和流大小。模式不能匹配类的父类或接口。

在以下示例中,过滤器允许example.File和拒绝example.Directory类。

ObjectInputFilterfilesOnlyFilter=ObjectInputFilter.Config.createFilter("example.File;!example.Directory");此示例仅允许example.File。其他所有类均被拒绝。

ObjectInputFilterfilesOnlyFilter=ObjectInputFilter.Config.createFilter("example.File;!*");将自定义过滤器设置为类可以将自定义过滤器实现为实现java.io.ObjectInputFilter接口的类,lambda表达式或方法。

过滤器通常是无状态的,仅对输入参数执行检查。但是可以实现一个过滤器,例如,维持对checkInput方法的调用之间的状态以对流中Artifacts的计数。

在下面的示例中,FilterNumber该类允许作为该类实例的任何对象,Number并拒绝所有其他对象。

classFilterNumberimplementsObjectInputFilter{publicStatuscheckInput(FilterInfofilterInfo){Class<>clazz=filterInfo.serialClass();if(clazz!=null){return(Number.class.isAssignableFrom(clazz))Status.ALLOWED:Status.REJECTED;}returnStatus.UNDECIDED;}}在示例中:

使用方法引用代替内联lambda表达式。

publicclassFilterClass{staticObjectInputFilter.StatusdateTimeFilter(ObjectInputFilter.FilterInfoinfo){Class<>serialClass=info.serialClass();if(serialClass!=null){returnserialClass.getPackageName().equals("java.time")ObjectInputFilter.Status.ALLOWED:ObjectInputFilter.Status.REJECTED;}returnObjectInputFilter.Status.UNDECIDED;}}示例:过滤java.base模块中的类

这个自定义过滤器(也实现为方法)仅允许在JDK的基本模块中找到的类。本示例适用于JDK9和更高版本。

staticObjectInputFilter.StatusbaseFilter(ObjectInputFilter.FilterInfoinfo){Class<>serialClass=info.serialClass();if(serialClass!=null){returnserialClass.getModule().getName().equals("java.base") ObjectInputFilter.Status.ALLOWED :ObjectInputFilter.Status.REJECTED;}returnObjectInputFilter.Status.UNDECIDED;}内置过滤器Java远程方法调用(RMI)注册表,RMI分布式垃圾收集器和Java管理扩展(JMX)都具有JDK中包含的过滤器。

注意:这些内置过滤器只能当做起点。编辑sun.rmi.transport.dgcFilter系统属性以配置黑名单和/或扩展白名单以为分布式垃圾收集器添加附加保护。为了保护整个程序,请将模式添加到jdk.serialFilter全局系统属性中,以提供其他没有自定义过滤器的序列化用户的保护。

RMI分布式垃圾收集器具有一个内置的白名单过滤器,可以接受一组有限的类。它包括的情况下java.rmi.server.ObjID,java.rmi.server.UID,java.rmi.dgc.VMID,和java.rmi.dgc.Lease类。

内置过滤器包括尺寸限制:

maxarray=1000000,maxdepth=20通过使用sun.rmi.transport.dgcFilter模式的system属性定义过滤器来取代内置过滤器。如果过滤器接受传递给过滤器的类,或者拒绝类或大小,则不会调用内置过滤器。如果取代的过滤器不接受或拒绝任何内容,则将调用内置过滤器。

注意:这些内置过滤器只能当做起点。编辑jmx.remote.rmi.server.serial.filter.pattern管理属性以配置黑名单和/或扩展白名单以为JMX添加其他保护。为了保护整个应用程序,请将模式添加到jdk.serialFilter全局系统属性中,以提供其他没有自定义过滤器的序列化用户的保护。

JMX具有一个内置过滤器,用于限制允许通过RMI作为反序列化参数发送到服务器的一组类。默认情况下,该过滤器是禁用的。要启用过滤器,请jmx.remote.rmi.server.serial.filter.pattern使用模式定义管理属性。

该模式必须包括允许通过RMI作为参数发送到服务器的类型以及它们所依赖的所有类型javax.management.ObjectName以及java.rmi.MarshalledObject类型。例如,要将允许的类集限制为OpenMBean类型及其依赖的类型,请在management.properties文件中添加以下行。

com.sun.management.jmxremote.serial.filter.pattern=java.lang.*;java.math.BigInteger;java.math.BigDecimal;java.util.*;javax.management.openmbean.*;javax.management.ObjectName;java.rmi.MarshalledObject;!*记录过滤器操作日志记录用来记录对序列化筛选器的调用的初始化。在配置白名单和黑名单时,可以使用日志输出作为诊断工具来查看正在反序列化的内容,并确认设置。

启用日志记录后,过滤器操作将记录到java.io.serialization记录器中。

启用序列化过滤器日志记录,编辑$JDK_HOME/conf/logging.properties文件。

THE END
1.昆山恒清净化设备科技有限公司取得高效低阻袋式过滤器专利昆山恒清净化设备科技有限公司取得高效低阻袋式过滤器专利 金融界2024年11月23日消息,国家知识产权局信息显示,昆山恒清净化设备科技有限公司取得一项名为“一种高效低阻袋式过滤器”的专利,授权公告号 CN 116688660 B,申请日期为 2023年7月。 本文源自:金融界 作者:情报员...https://www.163.com/dy/article/JHM1I5BK0519QIKK.html
2....全程综合式电子水处理器,全程水过滤器,全程综合水过滤器,冷冻水系统...全程 水处理器,全程水处理器专业生产厂家,全程综合式电子水处理器,全程水过滤器,全程综合水过滤器,冷冻水系统全程水处理器,多相射频电子水处理器 一、产品功能 1.具有防垢、防腐、杀菌灭藻、超净过滤的综合功能,采用物理处理方式和化学处理方式相结合的综合水处理技术,辅助水质综合控制和水质动态监测等功能,实现...https://cn.made-in-china.com/gongying/chyglq-leKnLwVOyBYy.html
3.反冲洗过滤器全程水处理器旋流除砂器自清洗过滤器主营产品:反冲洗过滤器; 全自动过滤器; 自清洗过滤器; 管道过滤器; 全程水处理器 第15年会员 公司信息未实地核实 推荐精品 查看更多推荐 >> 全自动反冲洗过滤器 价格:8800.00元 规格:BYJK 公司介绍 更多公司介绍 >> 铭源凯德过滤设备(北京)有限公司是一家致力于科研、生产、销售水处理设备的专业厂家。公司运作...http://shop.jc001.cn/1404984/
4.反冲洗过滤器智能压差过滤器全程综合水处理器电子水处理器旁...水过滤器,由简体、不锈钢滤网、排污部分、传动装置及电气控制部分组成。过滤机工作时,待过滤的水由进水口进入,流经滤网,通过出口进入用户所须的管道进行工艺循环,水中的颗粒杂质被截留在滤网内部,最终由排污口排除。 用途 水过滤器广泛用于冶金、化工、石油、造纸、医药、食品、采矿、电力、城市给水领域。诸如工业废水...http://shandongbeipiao.com/pd.jsp?fromColId=108&id=33
5.自清洗过滤器全自动自清洗过滤器反冲洗活性炭过滤器北京罗道罗量子科技集团有限公司是集研发、生产、销售于一体的过滤设备公司,公司产品有:自清洗过滤器,全自动过滤器,反冲洗过滤器,活性炭过滤器,全自动自清洗过滤器等,欢迎来电咨询!http://www.luodaoluo.com/
6.加药装置自清洗过滤器全程综合水处理器自清洗过滤器 全程综合水处理器 紫外线杀菌器 电子除垢仪 软水器 螺旋脱气除污器 酒店厨房不锈钢隔油池 油烟净化器 农业灌溉过滤器 紫外线杀菌器说明书(菌立清紫外线杀菌器说明书) 紫外线杀菌器的详细介绍(家用微型紫外线杀菌器) 全程综合水处理器详细说明(全程综合水处理器详细说明书) ...http://hzsrhb.51sole.com/companyproduct.htm
7.全自动石英砂过滤器定压补水装置全程综合水处理器杭州科福莱流体技术有限公司是一家专注于全自动加药装置、冷凝器在线清洗装置技术应用的国家高新技术企业,拥有6000平方米的生产基地和技术开发中心,承蒙广大客户厚爱,公司将一如既往的致力于中央空调循环水系统的水处理产品研发和应用!http://www.kefuly.com/
8.紫外线杀菌器旁流水处理器全自动过滤器全程综合水处理器公司介绍 杭州励进环保设备有限公司是一家专业生产紫外线杀菌器,旁流水处理器,全自动过滤器,全程综合水处理器,电子水处理器,袋式过滤器,自清洗过滤器,浅层砂过滤器,盘式过滤器,定压补水装置,叠片过滤器,疏水自动加压器,浅层介质过滤器等环保水处理设备的专业生产厂家。http://hzljhb.m.51pla.com/
9.反冲洗过滤器反冲排污过滤器产品特点 1.过滤精度高:过滤精度范围广 ,d=0.5 ~ 1.2mm ; 2.使用寿命长:由不锈钢楔形条状滤网及优质碳钢筒体组成; 3.综合成本低:杭州桂冠环保科技有限公司无需拆卸和更换滤网,使用寿命长达 20 年; 4.操作简便效率高:无需接旁路,无需拆机清理,过滤反冲效果好 。全自动过滤器,过滤器,全程综...http://www.guiguanwater.com/product_db.asp?id=83
10.水处理设备过滤器冷却塔吸垢器水处理器紫外线杀菌器杭州桂冠环保专业生产水处理器,杭州电子除垢仪,水处理设备,过滤器,自清洗过滤器,盘式过滤器,砂石过滤器,冷却塔吸垢器,电解水处理器,全程综合水处理器,刷式过滤器,浙江紫外线消毒器,杭州紫外线杀菌器,水箱水处理器的厂家。http://www.hzvalve.net/
11.福米德不锈钢SCFN自清洗过滤器水过滤设备 自清洗过滤器 反冲洗过滤器 旁流水处理器 紫外线消毒器 全程综合水处理器 盘式过滤器 机械介质过滤器 多滤芯自清洗过滤器 的详细信息 在净水系统超滤系统的预处理,冶金行业的钢厂冲渣水、高压除磷水、热轧、冷轧循环水等应用非常广泛,在农业方面主要针对的是喷灌和滴灌系统,在宁夏、甘肃、新疆使用效果是...http://sdfmd1.famens.com/Products-763318.html
12....海绵铁除氧器叠片过滤器反渗透分立阀软水器全程处理器...北京清华捷源科技开发有限公司-解析除氧器,网式过滤器,海绵铁除氧器,叠片过滤器,反渗透,分立阀软水器,全程处理器,以色列盘式过滤器,http://myshh.zhuigan.cn/
1.全程综合水处理器产品百科全程综合水处理器 产品介绍: 全程综合水处理器是采用高频技术与电能磁场效应的结合方式,针对电化学腐蚀、结垢、菌藻繁殖的不同问题,采用多重频段及静电高压组合,设计制造的。可根据用户要求制造电动排污,直通、同侧、异侧等不同的接口方式。也可根据用户要求制造高精度规格的过滤网。通过长期实践证明,在现今的水系统...http://www.ysdhbsb.com/Products-8827257.html
2.全自动过滤器,全程水处理器,自清洗过滤器—干燥设备网在一般的过滤装置中,随着过滤过程的继续,液体内的固体杂质截留在过滤元件表面,引起压力降增加,过滤阻力增大,过滤效率下降。这时一般需中断过滤操作,更换过滤元件或取出清洗,既费时又费事,影响处理效率。 BYJK系列多滤筒全自动过滤器很好地解决了这个问题,该过滤机具有连续过滤、自动反冲洗分度排污、体积小结构紧凑、运转...http://www.mydry.cn/product/pro2389031.html
3.自清洗过滤器反冲洗过滤器全程水处理器除铁锰过滤器北京莱金源水处理技术有限公司(https://bjljyscl.gys.cn)主营产品包括自清洗过滤器、反冲洗过滤器、全程水处理器、除铁锰过滤器等,北京莱金源水处理技术有限公司负责人李先生,北京莱金源水处理技术有限公司希望能与您成为合作伙伴https://bjljyscl.cn.china.cn/
4.全程水处理器全自动过滤器自清洗过滤器反冲洗过滤器博源金凯过滤设备(北京)有限公司生产:过滤器,全程水处理器,旋流除砂器,自清洗过滤器,全自动自清洗过滤器,反冲洗过滤器,旁流水处理器,手动刷式过滤器,管道过滤器,黄锈水处理器,综合水处理器,全自动排污过滤器,电子水处理器,活性炭过滤器,全自动过滤器,袋式过滤器,冷凝水除http://bjbyjk.com/
5.全程综合水处理器产品全程综合水处理器 针对各种循环水系统中普遍存在的四大问题:腐蚀、结垢、菌藻、水质恶化而研制的综合型水处理器,由单台设备代替需要多台设备才能完成的处理过程,从而取代了传统的处理方式。具有对水质综合优化处理,防垢除垢、防腐阻锈、杀菌灭藻、超净过滤功能。机电一体化的设计、纯物理方式处理,无需化学药剂,阻力小...http://www.jinlvhuanbao.net/usercategory/product/407700/
6.产品展示过滤器自清洗过滤器旋流除砂器反冲洗过滤器产品展示 产品* 过滤器_自清洗过滤器_旋流除砂器_反冲洗过滤器_全程水处理器_北京莱金源水处理技术有限公司http://www.bjmykd.com/?p=8
7.全自动反冲洗过滤器过滤器产品中心全程综合水处理器产品特点:新乡市康达水处理阀门厂【赵经理 13069356646】主要经营的产品有:全程综合水处理器,內磁水处理器,旁流水处理器,底阀,旋启式止回阀等。 在线订购 咨询热线:13069356646 产品详情 n产品概述 反冲洗过滤器,是一种利用滤网直接拦截水中的杂质,去除水体悬浮物、颗粒物,降低浊度,净化水质,减少系统污垢、菌藻、锈...http://www.kdsclfm.com/product/45_29
8.循环水过滤器工业水过滤器反冲洗过滤器冷却塔自清洗过滤器...东莞珀蓝特(服务热线:400-999-7236)成立于2008年,专注循环水处理研发生产,主营产品:全自动加药装置、冷凝器胶球在线清洗装置、定压补水装置、物化全程综合水处理器,自清洗过滤器等水处理设备。http://www.polamter.com/gyglsclq.shtml
9.过滤器,全程水处理器,旋流除砂器,自清洗过滤器,全自动自清洗过滤...铭源凯德过滤设备(北京)有限公司主要经营过滤器,全程水处理器,旋流除砂器,自清洗过滤器,全自动自清洗过滤器,反冲洗过滤器,旁流水处理器,手动刷式过滤器,管道过滤器,黄锈水处理器一系列产品,公司位于北京市海淀区北京分机二厂一号办公楼, 铭源凯德过滤设备(北京)有限公司https://www.foodjx.com/st78770