如何正确实现一个自定义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- ...
随机推荐
- 小程序提交POST请求,出现405错误
status": 405, "error": "Method Not Allowed", "message": "Req ...
- Python异步编程之web框架 异步vs同步 文件IO任务压测对比
测试基本信息 主题:比较异步框架和同步框架在文件IO操作的性能差异 python版本:python 3.8 压测工具:locust web框架:同步:flask 异步:aiohttp.starlett ...
- string类型可以作为lock的锁对象吗
lock 关键字介绍 lock 关键字是用于在多线程编程中实现同步和互斥访问的关键字.它的作用是确保共享资源在任意时刻只能被一个线程访问,从而避免出现竞态条件(race condition)和数据不一 ...
- GPT生成式预训练Transformer架构应用实战
目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...
- 详解nvim内建LSP体系与基于nvim-cmp的代码补全体系
2023年,nvim以及其生态已经发展的愈来愈完善了.nvim内置的LSP(以及具体的语言服务)加上众多插件,可以搭建出支持各种类型语法检查.代码补全.代码格式化等功能的IDE.网络上关于如何配置的文 ...
- 即构SDK5月迭代:新增声道选择、网络探测、智能消噪等功能,打造更优的视听体验
即构SDK5月份的迭代更新如期而至,本月互动视频(LiveRoom).实时语音(AudioRoom)两大SDK以及录制插件(PlayRecord)均有新功能上线.新增的声道选择.变调控制.智能消噪.枚 ...
- 无需学习Python,一个公式搞定领导想看的大屏
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 不要让"做不了"成为数字化转型的障碍 随着 ...
- .NET Core中关于阿拉伯语环境下的坑:Input string was not in a correct format.
结论 .NET Core项目(.NET Framework没出现)在阿拉伯语(即语言名称是ar-开头的语言)环境下,将负数字符串转成数字,即int.Parse("-1")或Conv ...
- Python将大的csv文件拆分多个小的csv文件
#ecoding=utf-8 import os import time # 2019/9/8 将大的csv文件拆分多个小的csv文件 def mkSubFile(lines, head, srcNa ...
- ABP VNext添加全局认证(如何继承AuthorizeFilter)
前言 目前公司采用的开发框架是ABP VNext微服务框架 最近突然发现一个问题,ABP中如果控制器或服务层没有加 Authorize特性的话,则不会走身份认证,且不会认证Token 如图: 但是项目 ...