
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接口 , 可以创建自定义序列化过滤器 。
当然 , 自己实现的序列化过滤器就不再受制于对象图最大深度、对象图最大引用数、对象图最大字节数、最大数组大小、类名/包名和模块名的黑白名单等检查项目了 。
- 苹果|华为新一代“小方表”来了:Watch FIT 2正式官宣
- 小米|小米最强影像旗舰!小米12S系列海报泄密:徕卡标变白了
- 徕卡|超大杯命名揭晓!卢伟冰换上小米12S Ultra
- 户外|“小眼镜”增多 专家支招教你科学用眼
- 单项冠军|再添三家“小巨人”,青岛高新区梯度培育见成效
- 陨石|小行星“打水漂”闯入地球 形成世界最长陨石陨落带
- 小米|小米12S系列官宣7月4日正式发布:小米与徕卡联合研发
- 个头大的车厘子比小樱桃营养价值更高,对吗 蚂蚁新村6月28日答案最新
- ssd|小屏旗舰跌至2699元,67W快充+5000万三摄,成荣耀70最大对手
- ios16|一步到位能用5年,目前这3款手机能闭眼入,买手机不要太小气
