如何正确实现一个自定义Exception(二)
上一篇《如何正确实现一个自定义 Exception》发布后获得不少 star。有同学表示很担忧,原来自己这么多年一直写错了。其实大家不用过分纠结,如果写的是 .NET CORE 1.0+ 的程序,那么大概率是没有问题的。
有大佬已经在评论区指出这些信息是过时的了。确实在.NET CORE 发布之后,Exception
已经不在推荐实现 ISerializable
接口。让我们细说一下。
BinaryFormatter security vulnerabilities
上一篇我们谈论了这么多,其实都是在说 ISerializable
的 patten。ISerializable
主要的作用就是给 BinaryFormatter
序列化器提供指示如何进行序列化/反序列化。也就是说这个接口基本上就是给 BinaryFormatter
设计的。BinaryFormatter
主要是给 .NET remoting 技术服务(一种古老的 RPC 技术,听过的都是老司机,不太确定 WCF 的 Binary 序列化是否使用该技术)。
但是很不幸,这个 BinaryFormatter
存在严重的安全风险。
BinaryFormatter
类型会带来风险,不建议将其用于数据处理。 即使应用程序认为自己正在处理的数据是可信的,也应尽快停止使用BinaryFormatter
。BinaryFormatter
不安全,无法确保安全。
不光是 BinaryFormatter
有风险,以下这些序列化器同样存在风险,应避免使用:
- SoapFormatter
- LosFormatter
- NetDataContractSerializer
- ObjectStateFormatter
当前微软主要推荐使用:
- System.Text.Json
- XmlSerializer
https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/binaryformatter-security-guide
其实不光是 .NET,其他语言在序列化反序列化上都很容易引入安全漏洞,比如 JAVA 的 jackson
就爆过序列化安全漏洞。
BinaryFormatter Obsolete
由于 remoting 技术在 .NET CORE 中已经废弃,并且有严重的安全风险,所以微软开始慢慢淘汰 BinaryFormatter
这个接口。
以下是 binaryformatter-obsoletion
的 roadmap:
- .NET 5 (Nov 2020)
- Allow disabling BinaryFormatter via an opt-in feature switch
- ASP.NET projects disable BinaryFormatter by default but can re-enable
- WASM projects disable BinaryFormatter with no ability to re-enable
- All other project types (console, WinForms, etc.) enable BinaryFormatter by default
- .NET produces guidance document on migrating away from BinaryFormatter
- All outstanding BinaryFormatter-related issues resolved won't fix
- Introduce a BinaryFormatter tracing event source
- Serialize and Deserialize marked obsolete as warning
- .NET 6 (Nov 2021)
- No new [Serializable] types introduced
- No new calls to BinaryFormatter from any first-party dotnet org code base
- All first-party dotnet org code bases begin migration away from BinaryFormatter
- .NET 7 (Nov 2022)
- All first-party dotnet org code bases continue migration away from BinaryFormatter
- References to BinaryFormatter APIs marked obsolete as warnings in .NET 5 now result
- in build errors
- A back-compat switch is made available to turn these back to warnings
- .NET 8 (Nov 2023)
- All first-party dotnet org code bases complete migration away from BinaryFormatter
- BinaryFormatter disabled by default across all project types
- All not-yet-obsolete BinaryFormatter APIs marked obsolete as warning
- Additional legacy serialization infrastructure marked obsolete as warning
- No new [Serializable] types introduced (all target frameworks)
- .NET 9 (Nov 2024)
- Remainder of legacy serialization infrastructure marked obsolete as warning
- BinaryFormatter infrastructure removed from .NET
- Back-compat switches also removed
从 .NET5 开始会出现警告,到.NET6 BUILD 的时候直接会是 ERROR,但是可以强制启用。到.NET9 会完全从 .NET 中移除。
那么既然 BinaryFormatter
在目前已经不在推荐使用,自然我们的自定义 Exception
也不用遵循 ISerializable
patten 了。以下链接是微软给出的当前自定义 Exception
实现的建议,太长就不复制了。总之已经不在需求实现 protected
的序列化构造器,也不用 override GetObjectData
方法。
https://github.com/dotnet/docs/issues/34893
感谢
- 饭勺oO
- czd890
等大佬提供相关链接。
关注我的公众号一起玩转技术
如何正确实现一个自定义Exception(二)的更多相关文章
- Java自定义Exception
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)
译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer& ...
- Qt之自定义托盘(二)
上一篇文章讲述了自定义Qt托盘,不过不是使用QSystemTrayIcon这个类,而是我们自己完全自定义的一个类,我们只需要处理这个类的鼠标hover.鼠标左键点击.鼠标右键点击和鼠标左键双击,就可以 ...
- Android自定义视图二:如何绘制内容
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- netty源码解解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端
本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决 ...
- 【SpringBoot 基础系列】实现一个自定义配置加载器(应用篇)
[SpringBoot 基础系列]实现一个自定义配置加载器(应用篇) Spring 中提供了@Value注解,用来绑定配置,可以实现从配置文件中,读取对应的配置并赋值给成员变量:某些时候,我们的配置可 ...
- CKEditor在线编辑器增加一个自定义插件
CKEditor是一个非常优秀的在线编辑器,它的前身就是FCKEditor,CKEditor据官方说是重写了内核的,但功能和性能比FCKEditor更为强大和优越.记得07年的时候第一次接触FCKEd ...
- 如何创建一个自定义jQuery插件
简介 jQuery 库是专为加快 JavaScript 开发速度而设计的.通过简化编写 JavaScript 的方式,减少代码量.使用 jQuery 库时,您可能会发现您经常为一些常用函数重写相同的代 ...
- 如何用一个语句判断一个整数是不是二的整数次幂——从一道简单的面试题浅谈C语言的类型提升(type promotion)
最近招聘季,看JULY大哥的面试100题时,碰到这么一个扩展问题: 如何用一个语句判断一个整数是不是二的整数次幂?(此题在编程之美也有) easy, 2的整数次幂的二进制形式只有一个1,只要用i和i- ...
随机推荐
- Flutter调优--深入探究MediaQuery引起界面Rebuild的原因及解决办法
前言 我们可以通过MediaQuery.of(context)方法获取到一些设备和系统的相关信息,比如状态栏的高度.当前是否是黑暗模式等等,使用起来相当方便,但是也要注意可能引起的页面rebuild问 ...
- Nexus3 重置 admin 账号密码
问题背景 nexus3 的 admin 账号密码忘记了,需要重置. 环境说明 nexus 基于 docker-compose 部署,版本 nexus3.26 docker 镜像 sonatype/ne ...
- String和new String的那点事
String a= "test"; 此语句含义是:在常量池中创建test字符串对象,变量aa是对常量池中此对象的引用 String aa = new String("te ...
- ApacheSpark:HowtoBuildandDeployaRealtimeDataProcessinga
目录 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4.1 应用场景介绍 4.2 应用实例分析 4. ...
- mysql高级进阶(存储过程、游标、触发器)
废话不多说,直接进入正题... 一.存储过程 a.概述 存储过程可以看成是对一系列 SQL 操作的批处理: 使用存储过程的好处 代码封装,保证了一定的安全性: 代码复用: 由于是预先编译,因此具有很高 ...
- ZEGO自研RTC+直播系统架构,如何支撑一场高质量直播
近年来得益于网络基础设施的进步,实时音视频(Real-Time Communication,以下简称 RTC)和直播(采用 CDN 进行内容分发)在各行业迅速落地,在疫情的催化下更是推动传统的教育.会 ...
- Microsoft edge锁定在任务栏上,被修改主页360的解决方法
今天从桌面下边的任务栏打开Microsoft edge浏览器,突然发现主页被篡改为360导航了(生气!恶龙咆哮ooo 在桌面上是Microsoft edge,固定到任务栏就成为Microsoft ed ...
- 内核源码中单个.o文件的编译过程(六)
通过对过渡篇的学习,相信你已经具有了相当的知识储备,接下来就来继续学习单个.o文件的编译过程 以/drivers/char/mem.c的编译为例 make /drivers/char/mem.o 一. ...
- 2023icpc大学生程序设计竞赛-zx
第一次出市打线下,洛阳师范风景不错,就是比赛的筹备有点波折.题目在这几次xcpc省赛算是比较难的.开始一个二维前缀和板子以及一个小贪心还是顺利拿下,后面那个dp一直是我们的短板wa了几发才过,后面就是 ...
- 【ElasticSearch】大数据量情况下的前缀、中缀实时搜索方案
简述 业务开发中经常会遇到这样一种情况,用户在搜索框输入时要实时展示搜索相关的结果.要实现这个场景常用的方案有Completion Suggester.search_as_you_type.那么这两种 ...