Java恶意序列化背后的历史和动机

与Java的序列化机制有关的问题已广为人知。 有效的Java 1st Edition (第10章)和有效的Java 2nd Edition (第11章)的整个最后一章都专门讨论Java的序列化主题。 Effective Java 3rd Edition (第12章)的最后一章仍致力于序列化,但是其中包括一个新项目(Item 85) ,该项目甚至进一步强调了与Java序列化有关的两个断言 :

  • 避免序列化攻击的最佳方法是永远不要反序列化任何东西。
  • 您没有理由在您编写的任何新系统中使用Java序列化。

在最近发布的文档“ 迈向更好的序列化 ”中,Brian Goetz“探讨了改善Java平台中序列化的可能方向。” 尽管本文档的主要目的是为Java序列化提出潜在的新方向,但它只是“一个探索性文档,并不构成任何特定功能的计划。” 这意味着对于Java序列化可能采取的方向来说,这是一个有趣的读物,但是阅读本文档对于Java序列化的总结(当前存在的意义以及我们如何到达此地)具有重要的价值。 这是我其余文章的主题,在本文中我将参考并总结“ 迈向更好的序列化 ”的各个部分,这些部分使我感觉最清楚地阐明了Java序列化机制的当前问题以及我们为什么遇到这些问题。

Goetz在Java序列化的“悖论”中引人注目的段落打开了文档的“动机”部分:


Java的序列化工具有点自相矛盾。 一方面,这可能对Java的成功至关重要-没有它,Java可能不会占据统治地位,因为序列化实现了透明的远程处理,进而实现了Java EE的成功。 另一方面,Java的序列化几乎使每一个错误都可以想象到,并给库维护人员,语言开发人员和用户带来持续的税负(以维护成本,安全风险和缓慢的发展为形式)。

Goetz文档“动机”部分的另一段区分了序列化的一般概念和Java当前的序列化机制的特定设计


需要明确的是,
序列化的概念 将对象转换为可以轻松跨JVM传输并在另一侧重构的形式的能力是一个非常合理的想法。 问题出在
Java中的序列化设计 ,以及它如何适合(或更确切地说,不适合)对象模型。

Goetz指出“ Java的序列化(错误)是多方面的”,他概述了Java序列化设计所犯的“部分罪过”。 我强烈建议阅读原始文档 ,以获取对这些“罪过”的简明和说明性描述,此处仅作总结。

  • “伪装成图书馆的功能,但不是。”
    • “序列化伪装成一个库功能。
  • “假装是静态类型的功能,但不是。”
    • “可序列化性是对象的动态类型的函数,而不是其静态类型的函数。”
  • “编译器无济于事”指出“编写可序列化类时可能犯的各种错误”
  • “魔术方法和字段”是“不影响序列化行为的任何基类或接口指定的”
  • “绝对必要。”
  • “紧密结合到编码。”
  • “不幸的流格式”,“既不紧凑,也不高效,也不可读”。

Goetz还概述了这些Java序列化设计决策的后果(有关每个“严重问题”的更多背景,请参阅原始文档 ):

  • “使图书馆维护者瘫痪。”
    • “库设计人员在发布可序列化的类之前必须非常仔细地考虑-因为这样做可能使您维护与曾经被序列化的所有实例的兼容性。”

“嘲笑封装。”

  • “串行化是您内部状态的无形但公共的构造函数,以及一组无形但公共的访问器。”

在Goetz的“ 迈向更好的序列化 ”文档中,我最喜欢的部分可能是“潜在的错误”部分,因为Goetz在本部分中概述的项目是我编写,阅读和使用的其他Java代码中错误的常见原因。 换句话说,尽管Goetz特别讨论了这些设计决策如何导致Java的序列化机制出现问题,但我(毫无疑问)发现这些通用设计决策也导致了其他领域的问题。

Goetz用以下语句打开“潜在的错误”部分:“上面列出的许多设计错误都来自一个共同的来源-选择通过“魔术”实现序列化,而不是将解构和重建放在对象的第一位。模型本身。” 我发现由其他开发人员甚至我自己编写的“魔术”代码在以后常常令人困惑且难以推理。 我已经明确地意识到,通常最好使用简洁明了的代码。

格茨补充说:“更糟糕的是,魔术尽了最大努力,以使读者看不见。” 当我们第一次实现隐形的“魔术”设计时,它们通常看起来很聪明,但是当他们突然需要对基础魔术的可见性时,使必须阅读,维护和更改代码的开发人员感到非常痛苦。

Goetz引用了Edsger W.Dijkstra的话,并写道:“序列化(目前已实现)与减少程序文本和其计算效果之间的差距完全相反; 我们可能会错误地假设我们的对象总是由类中编写的构造函数初始化而得到原谅,但我们不必如此。

Goetz在“底层错误”部分的结尾处开始了一段,“序列化除了试图变得不可见之外,还尝试做太多事情 。 尽管Goetz专门针对Java的序列化编写了当前的“序列化程序 (而不是仅仅序列化数据 )”的文章,但从更广泛的意义上讲,我已经无数次地看到了这个问题。 对于我们的开发人员来说,设计和实现可以执行某些我们认为可能对某人有用的小功能的代码很诱人,即使绝大多数(或什至所有当前已知的)用户和用例只需要一个简单的子集即可。功能。

鉴于“ 迈向更好的序列化 ”的目标是“探索改善Java平台中序列化的可能方向”,因此文档中涉及到可能影响Java未来序列化机制的设计甚至实现细节的重要细节也就不足为奇了。 此外, Project Amber邮件列表( amber-dev和amber-spec-experts )也对Java序列化的未来发展方向进行了重要讨论。 但是,本文的目的不是看Java序列化的未来,而是着眼于本文档如何很好地总结了Java当前的序列化机制及其历史。

尽管前面提到的Project Amber邮件列表中的消息集中在Java的序列化机制的潜在未来上,但是这些帖子中有关Java当前序列化的一些有趣的评论增加了Goetz在“ 迈向更好的序列化 ”中所总结的内容。 以下是一些最有趣的内容:

  • Goetz在宣布“ 迈向更好的序列化 ” 的帖子中指出,该提案“从根本上解决了序列化的风险”,并“将对象序列化带到了光明的地方,为了确保安全性,必须要这样做。”
  • Brian Goetz的帖子通过暗示重申了当今Java序列化问题的很大一部分是在不调用构造函数的情况下构造对象:“我们的主要安全目标[是允许]反序列化[通过]构造函数进行。”
  • 斯图尔特·马克斯(Stuart Marks)的帖子指出:“提案中关于便利性的推理路线并不是说便利本身就是邪恶的,而是为了追求便利,原始设计采用了语言学机制来实现这一目的。 这削弱了Java平台的某些基础,并直接导致了多个错误和安全漏洞,其中一些是我个人修复的。”
    • Marks概述了一些由于序列化相关的设计决策而导致JDK中细微错误的特定示例。
  • Kevin Bourrillion的帖子指出:“ Java的序列化实现很长一段时间以来一直是一个巨大的伤口”,并补充说“支持其他有线格式的每个框架始终必须从头开始。”

我强烈建议任何对Java序列化感兴趣的人阅读“ 迈向更好的序列化 ”,无论他们的主要兴趣是Java当前的序列化机制还是将来可能变成的东西。 从两个角度来看,这都是一个有趣的文档。

翻译自: https://www.javacodegeeks.com/2019/06/motivations-behind-javas-maligned-serialization.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出全面解析RDMA

RDMA(RemoteDirect Memory Access)技术全称远程直接内存访问,就是为了解决网络传输中客户端与服务器端数据处理的延迟而产生的。它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,…

pat 乙级 1030 完美数列(C++)

题目 给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。 输入格式&…

hypervisor介绍

hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟…

pat 乙级 1031 查验身份证(C++)

题目 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2&#xff0…

Selenium WebDriver中的TestNG侦听器及示例

Java提供了不同的接口,使您可以修改TestNG行为。 这些接口在Selenium WebDriver中进一步称为TestNG侦听器。 TestNG Listeners还允许您根据项目要求自定义测试日志或报告。 Selenium WebDriver中的TestNG侦听器是侦听某些事件并跟踪测试执行情况的模块,…

pat 乙级 1032 挖掘机技术哪家强(C++)

题目 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息…

Ubantu键盘快捷键

Ubuntu系统 长按"Win"键可打开快捷键提示界面

win10安装python详细过程

关于python的安装 一切语言皆为工具接下来咱们就开始吧一切语言皆为工具 既然你决定安装它,那就已经告知自己要掌握这门工具, 但是有一定你一定要铭记于心那就是: python 是个工具时刻想着如何用它解决你的问题【哪怕是一个简单的想法】 接…

Spring Boot中的@SpringBootConfiguration注释

Spring Boot中的 SpringBootConfiguration注释是一个类级别的注释,它指示此类提供了应用程序配置。 通常,具有main()方法的类最适合此注释。 我们通常使用SpringBootApplication批注,该批注会自动继承SpringBootConf…

第18次csp认证 201912-1 报数(C++)

题目 分析 需要跳过的包括:7的倍数和包括7的数。跳过的同时n要加一(总的报n个数,跳过的不算)。声明一个全局数组count[4]方法1:i1开始到n,把输入的i转化为字符串,然后在字符串里找’7’或者7的…

C++ vector求均值和方差

1 定义 &#xff08;1&#xff09;均值 &#xff08;2&#xff09;方差 &#xff08;3&#xff09;标准差 2 代码实现 //std::vector< double> 或者 std::vector< int> 类型变量求均值和方差 #include <numeric> #include <iostream> #include <m…

第18次csp认证 201912-2 回收站选址(C++)

题目 分析 每一个垃圾堆放处都可能是回收站&#xff0c;所以两轮循环&#xff0c;找出所有可以成为回收站的坐标。再两轮循环&#xff0c;确定所有回收站的得分最后输出每种得分的回收站个数 AC代码 #include <iostream> #include<string> using namespace std;…

Python——列表中存放字典遇到的问题

Python——列表中存放字典遇到的问题 使用列表、字典之间的相互嵌套可以很容易的实现json数据格式&#xff0c;但是昨天在往列表中装入字典时遇到了问题&#xff1a; 直接使用append方法将字典添加到列表中&#xff0c;如果需要更改字典中的数据&#xff0c;那么列表中的内容也…

jpa 返回数据转换_如何使用JPA类型转换器加密数据

jpa 返回数据转换几天前&#xff0c;我读了Bear Giles关于2012年使用JPA监听器进行数据库加密的有趣文章。他讨论了对加密解决方案的要求&#xff0c;并提供了JPA监听器的代码示例。 他的主要要求是&#xff1a; 提供不影响应用程序的透明加密&#xff0c; 能够在部署时添加加…

pat 乙级 1036 跟奥巴马一起编程(C++)

题目 美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形…

使用Jmeter的Websocket:获取性能数字

问题&#xff1a; 我最近遇到了一个问题&#xff0c;该问题需要针对多个用户测试SockJs / Stomp Spring Websocket代理的性能。 由于WebSocket本质上是异步的&#xff0c;因此它比常规的http / https请求-响应测试更加棘手。 解&#xff1a; 好了&#xff0c;无需解释为什么Jm…

NS3官方参考资料manual和tutorial

https://www.nsnam.org/releases/ns-3-33/documentation/

pat 乙级 1037 在霍格沃茨找零钱(C++)

题目 如果你是哈利波特迷&#xff0c;你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的&#xff1a;“十七个银西可(Sickle)兑一个加隆(Galleon)&#xff0c;二十九个纳特(Knut)兑一个西可&#xff0c;很容易。”现在&#xff0c;给定哈利应付的价钱 P 和他实付的…

Sublime删除所有包含特定值的行

1、选中包含的字符 2、全部选中包含这个字符&#xff1a; ALTF3 3、全选整行&#xff1a; 台式机&#xff1a;Shiftend 笔记本&#xff1a;ShiftFnend 4、删除所有数据&#xff1a; DELETE 5、删除所有空白行&#xff1a; 使用快捷方式直接删除空行&#xff0c;前提是进行如下…

PAT乙级 1038 统计同成绩学生 C++)

题目 本题要求读入 N 名学生的成绩&#xff0c;将获得某一给定分数的学生人数输出。 输入格式&#xff1a; 输入在第 1 行给出不超过 10​5的正整数 N&#xff0c;即学生总人数。随后一行给出 N 名学生的百分制整数成绩&#xff0c;中间以空格分隔。最后一行给出要查询的分数…