JDK 9新增了序列化过滤器(Serialization Filter) , JDK 17又修改了一次 。
想必大多数java程序员还在用着Java 8吧?还是建议提前了解一下JDK 9/10/11/12/13/14/15/16啊 , 毕竟现在都17了呢 。
【Java|Java小知识:序列化过滤器】今天这篇介绍一下JDK 9中新增的序列化过滤器 , 虽然JDK 8里面用不了 , 但是了解一下它的思想 , 变通一下 , 然后在JDK 8里面使用 , 能解决不少问题呢 。
序列化过滤器究竟是什么呢?它是一种让java程序更好地控制请求数据(incoming data)的反序列化方式的工具 。 换句话说 , 序列化过滤器是用来控制请求数据的反序列化的功能 。
序列化中有什么问题Java序列化一直以来都是各种bug或问题的源头 , 包括:
- 破坏封装性
- 魔法字段和方法影响的行为 , 例如readObject writeObject readObjectNoData readResolve writeReplace等 。
- 性能慢 , 无法满足互联网服务的性能要求 , 所以大厂后端的rpc框架几乎不会采用java序列化 , 用的都是hessian、protobuf甚至json等 。
所以Oracle一直强调 , “不要反序列化不可信任的数据”(参考Secure Coding Guidelines for Java SE)
另外 , 阿里fastjson经常爆出各种漏洞 , 绝大部分都与反序列化有关(光顾着追求快 , 基本的东西都弄丢了吧)
正是因为这些问题(破坏封装、readObject和不安全性) , JDK 9增加了序列化过滤器 。
如何配置序列化过滤器?序列化过滤器可以通过一个pattern来配置 , 而这个pattern可以基于:
- 对象图的最大深度
- 对象图的最大引用数
- 对象图的最大字节数
- 最大数组大小
- 类名、包名和模块名的黑白名单
构造好了pattern及对应过滤器之后 , 把这个pattern设置为安全属性 。 操作方法:
在文件$
JAVA_HOME/conf/security/java.security中增加一行以下内容
jdk.serialFilterFactory=<pattern>
这个过滤器除了可以作为安全属性之外 , 还可以被设置为一个JVM参数 , 格式:
-Djdk.serialFilter=<pattern>
除了安全属性和JVM参数以外 , 还可以在代码中配置 。 调用一个工厂方法 , 传入我们前面创建的pattern , 从而创建出过滤器 。 代码如下:
ObjectInputFilter.Config.createFilter(String);
上面我们使用了JDK自带的过滤器(基于pattern) , 其实通过继承ObjectInputFilter接口 , 可以创建自定义序列化过滤器 。
当然 , 自己实现的序列化过滤器就不再受制于对象图最大深度、对象图最大引用数、对象图最大字节数、最大数组大小、类名/包名和模块名的黑白名单等检查项目了 。
- 小米科技|不聊性能只谈拍照!新旗舰反向升级成潮流,拍照手机如何选?
- 华为|别不信!魅族如今处境,雷军早有预料,小米也早已体验
- 小米科技|预算只有两三千买这三款,颜值性能卓越,没有超高预算的用户看看
- 小米科技|RTX3060的性能到底如何?相比RTX2060提升有多大?
- 小米 11 Ultra 内测 NFC“读写勿扰”与“解锁后使用”功能
- 百度|马化腾的一句话,腾讯市值一小时暴涨1400亿港币,马云格局还是小了
- 拼多多|砍价永远差一刀?拼多多回应:小数点后有6位
- 飞利浦·斯塔克|最便宜的小米 12 来了,2000 块左右
- CPU|E5系列处理器——工作室和生产力专业处理器,小白请勿购买
- 小米科技|从4999跌至2889元,2K曲面屏+IP68防水,小米老款旗舰售价大跳水