asp.net网站开发实例教程pdf扁平式风格网站

张小明 2026/1/2 22:39:48
asp.net网站开发实例教程pdf,扁平式风格网站,wordpress 侧滑,vi设计都包括什么多态反序列化是处理继承结构对象序列化的常见需求#xff0c;但不同 JSON 序列化库的实现机制差异会带来显著的安全风险。微软 CA2326 规则明确警示#xff1a;避免使用非安全的 JsonSerializerSettings 配置#xff08;如 Newtonsoft.Json 的 TypeNameHandling 非 None 值但不同 JSON 序列化库的实现机制差异会带来显著的安全风险。微软 CA2326 规则明确警示避免使用非安全的 JsonSerializerSettings 配置如 Newtonsoft.Json 的 TypeNameHandling 非 None 值否则可能引发类型注入攻击。本文将对比 Newtonsoft.Json 与 System.Text.Json 在多态反序列化中的实现差异重点分析安全性问题并通过代码实例验证两者的安全表现。多态反序列化的实现机制差异Newtonsoft.Json基于TypeNameHandling 的灵活设计Newtonsoft.Json 通过 TypeNameHandling 配置项控制是否在 JSON 中嵌入类型元数据。当设置 TypeNameHandling 支持多态时JSON 会携带 $type 字段包含类型的完全限定名和程序集信息反序列化时直接根据该字段实例化对应类型。这种设计虽然灵活支持多态但缺乏默认的类型校验机制攻击者可构造包含恶意类型的 JSON触发敏感类型实例化。System.Text.Json多态配置的安全设计System.Text.Json 默认不支持多态反序列化需通过 [JsonDerivedType] 特性或 DerivedTypes 显式声明允许的派生类型。反序列化时仅处理配置过的类型拒绝未授权的类型注入从机制上规避了安全风险。CA2326 规则的警示CA2326 规则的核心是禁止使用 TypeNameHandling 非 None 值的配置 —— 攻击者可利用 $type 字段构造恶意 JSON实例化如 ProcessStartInfo执行系统命令、FileStream读写文件等敏感类型引发远程代码执行或数据泄露。using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Diagnostics; using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; namespace NewtonsoftSecurityDemo { [JsonPolymorphic(TypeDiscriminatorPropertyName CustomerType)] [JsonDerivedType(typeof(PaymentCompletedEvent), PaymentCompletedEvent)] [JsonDerivedType(typeof(OrderCreatedEvent), OrderCreatedEvent)] public class TransactionEvent { public string EventId { get; set; } Guid.NewGuid().ToString(); public DateTime EventTime { get; set; } DateTime.Now; public string OrderId { get; set; } // 业务扩展字段攻击者利用的入口 public object ExtData { get; set; } } public class PaymentCompletedEvent : TransactionEvent { public decimal Amount { get; set; } public string PaymentMethod { get; set; } } public class OrderCreatedEvent : TransactionEvent { public string UserId { get; set; } public int ItemCount { get; set; } } // Newtonsoft.Json 安全绑定器演示白名单校验 public class EventSerializationBinder : ISerializationBinder { // 仅允许的安全类型白名单 private readonly HashSetstring _allowedTypes new() { NewtonsoftSecurityDemo.PaymentCompletedEvent, NewtonsoftSecurityDemo.OrderCreatedEvent, //System.Diagnostics.ProcessStartInfo }; public Type BindToType(string assemblyName, string typeName) { // 仅允许白名单内的类型 if (!_allowedTypes.Contains(typeName)) { throw new NotSupportedException($禁止反序列化未授权类型{typeName}); } return Type.GetType(${typeName}, {assemblyName}) ?? typeof(TransactionEvent); } public void BindToName(Type serializedType, out string? assemblyName, out string? typeName) { assemblyName serializedType.Assembly.FullName; typeName serializedType.FullName; } } class Program { static void Main(string[] args) { Console.WriteLine( Newtonsoft.Json 命令执行攻击演示 ); Newtonsoft_Attack_ProcessStartInfo(); Console.WriteLine(\n Newtonsoft.Json 文件读取攻击演示 ); Newtonsoft_Attack_FileStream(); Console.WriteLine(\n Newtonsoft.Json 启用 SerializationBinder安全防护演示 ); Newtonsoft_Secure_WithBinder(); Console.WriteLine(\n System.Text.Json 安全防护演示 ); SystemTextJson_Defense(); Console.ReadKey(); } /// summary /// 模拟注入ProcessStartInfo执行系统命令 /// /summary static void Newtonsoft_Attack_ProcessStartInfo() { string maliciousCallbackJson $ {{ $type: NewtonsoftSecurityDemo.PaymentCompletedEvent, NewtonsoftSecurityDemo, EventId: {Guid.NewGuid()}, OrderId: ORD_{new Random().Next(1000, 9999)}, Amount: 999.00, PaymentMethod: Alipay, ExtData: {{ $type: System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process, FileName: cmd.exe, Arguments: /c echo some scripts C:\temp\attack_log.txt echo doing C:\temp\attack_log.txt, UseShellExecute: true }} }}; var settings new JsonSerializerSettings { TypeNameHandling TypeNameHandling.Auto, }; var eventData Newtonsoft.Json.JsonConvert.DeserializeObjectTransactionEvent(maliciousCallbackJson, settings); Console.WriteLine($处理订单事件{eventData.OrderId}); if (eventData.ExtData is ProcessStartInfo psi) { Directory.CreateDirectory(C:\temp); Process.Start(psi); Console.WriteLine($ [攻击成功] 执行命令{psi.Arguments}); Console.WriteLine($ [攻击结果] 生成文件C:\temp\attack_log.txt 文件内容); if (File.Exists(C:\temp\attack_log.txt)) { string content File.ReadAllText(C:\temp\attack_log.txt); Console.WriteLine(${content}); } } } /// summary /// 模拟注入FileInfo读取敏感文件 /// /summary static void Newtonsoft_Attack_FileStream() { string targetFile Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), appsettings.json); if (!File.Exists(targetFile)) { File.WriteAllText(targetFile, ConnectionString: 123456); } string maliciousExportJson $ {{ $type: NewtonsoftSecurityDemo.OrderCreatedEvent, NewtonsoftSecurityDemo, OrderId: ORD_{new Random().Next(1000, 9999)}, UserId: user_{new Random().Next(100, 999)}, ExtData: {{ $type: System.IO.FileInfo, FileName: {targetFile.Replace(\, \\)} }} }}; var settings new JsonSerializerSettings { TypeNameHandling TypeNameHandling.Auto }; var eventData Newtonsoft.Json.JsonConvert.DeserializeObjectTransactionEvent(maliciousExportJson, settings); Console.WriteLine($处理订单导出{eventData.OrderId}); // 通过FileInfo读取文件内容模拟攻击逻辑 if (eventData.ExtData is FileInfo fileInfo) { using (var sr new StreamReader(fileInfo.OpenRead())) { string sensitiveContent sr.ReadToEnd(); Console.WriteLine($ [攻击成功] 读取敏感文件内容\n{sensitiveContent}); } } } /// summary /// Newtonsoft.Json 启用SerializationBinder拦截恶意类型 /// /summary static void Newtonsoft_Secure_WithBinder() { string maliciousCallbackJson $ {{ $type: NewtonsoftSecurityDemo.PaymentCompletedEvent, NewtonsoftSecurityDemo, EventId: {Guid.NewGuid()}, OrderId: ORD_{new Random().Next(1000, 9999)}, Amount: 999.00, PaymentMethod: Alipay, ExtData: {{ $type: System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process, FileName: cmd.exe, Arguments: /c echo some scripts C:\temp\attack_log.txt echo doing C:\temp\attack_log.txt, UseShellExecute: true }} }}; var settings new JsonSerializerSettings { TypeNameHandling TypeNameHandling.Auto, SerializationBinder new EventSerializationBinder() // 启用白名单校验 }; try { var eventData Newtonsoft.Json.JsonConvert.DeserializeObjectTransactionEvent(maliciousCallbackJson, settings); if (eventData.ExtData is ProcessStartInfo) { Console.WriteLine( [防护失效] 恶意类型未被拦截异常); } } catch (Exception ex) { Console.WriteLine($ [防护成功] 拦截未授权类型{ex.Message}); } } /// summary /// System.Text.Json 安全防护验证 /// /summary static void SystemTextJson_Defense() { string maliciousCallbackJson $ {{ CustomerType: PaymentCompletedEvent, EventId: {Guid.NewGuid()}, OrderId: ORD_{new Random().Next(1000, 9999)}, Amount: 999.00, PaymentMethod: Alipay, ExtData: {{ $type: System.Diagnostics.ProcessStartInfo,System.Diagnostics.Process, FileName: cmd.exe, Arguments: /c echo some scripts C:\temp\attack_log.txt echo doing C:\temp\attack_log.txt, UseShellExecute: true }} }}; var eventData System.Text.Json.JsonSerializer.DeserializeTransactionEvent(maliciousCallbackJson); Console.WriteLine($ 主对象类型{eventData.GetType().FullName}); Console.WriteLine($ ExtData 实际类型{eventData.ExtData.GetType().FullName}); if (eventData.ExtData is JsonElement) { Console.WriteLine( [防护成功] 恶意类型ProcessStartInfo被拦截ExtData仅保留原始JSON结构未反序列化为恶意对象); } else if (eventData.ExtData is ProcessStartInfo) { Console.WriteLine( [防护失效] 恶意类型解析成功); } else { Console.WriteLine($ [正常业务] 解析到合法类型{eventData.ExtData.GetType().FullName}); } Console.WriteLine(\n尝试转换ExtData为ProcessStartInfo); try { var psi (ProcessStartInfo)eventData.ExtData; Console.WriteLine( [防护失效] 恶意类型解析成功); } catch (InvalidCastException ex) { Console.WriteLine($ [防护成功] 强制转换失败原因{ex.Message}); } } } }运行结果为通过 Demo 可以发现- Newtonsoft 无防护时攻击成功- Newtonsoft 启用 SerializationBinder 后拦截了恶意类型- System.Text.Json 始终拦截恶意类型ExtData 为 JsonElement无法转换为 ProcessStartInfo。为什么 Newtonsoft.Json 启用 SerializationBinder 可降低风险先看代码public class EventSerializationBinder : ISerializationBinder { // 仅允许的安全类型白名单 private readonly HashSetstring _allowedTypes new() { NewtonsoftSecurityDemo.PaymentCompletedEvent, NewtonsoftSecurityDemo.OrderCreatedEvent, //System.Diagnostics.ProcessStartInfo }; public Type BindToType(string assemblyName, string typeName) { // 仅允许白名单内的类型 if (!_allowedTypes.Contains(typeName)) { throw new NotSupportedException($禁止反序列化未授权类型{typeName}); } return Type.GetType(${typeName}, {assemblyName}) ?? typeof(TransactionEvent); } public void BindToName(Type serializedType, out string? assemblyName, out string? typeName) { assemblyName serializedType.Assembly.FullName; typeName serializedType.FullName; } }SerializationBinder 的核心作用是接管从 JSON 中的 $type 字符串 到实际 Type 类型的映射过程强制校验类型合法性。简单说- 无 SerializationBinder反序列化器会无条件反射创建 $type 指定的任意类型包括危险类型- 有 SerializationBinder反序列化器必须经过你的自定义校验逻辑仅允许白名单内的类型被实例化直接阻断恶意类型的创建。小结Newtonsoft.Json 的 TypeNameHandling 机制虽灵活但易被利用触发安全漏洞System.Text.Json 通过显式多态配置白名单的设计规避了类型注入风险。在实际开发中针对多态场景建议优先使用 System.Text.Json。若必须使用 Newtonsoft.Json需遵循以下安全实践- 避免使用 TypeNameHandling 非 None 值。- 若必须启用需严格校验 $type 字段类型的合法性仅允许安全类型。我希望您喜欢这篇文章并一如既往地感谢您阅读并与朋友和同事分享我的文章。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

自己做网站要钱么wordpress要不要付费

元组的特点: 有序,可以重复,这一点和列表一样元组中的元素不能修改,这一点非常重要,深度学习场景中很多参数、形状定义好了确保后续不能被修改。 管道工程中pipeline类接收的是一个包含多个小元组的 列表 作为输入。 …

张小明 2026/1/1 5:08:24 网站建设

wordpress 图片2m聊城网站优化案例

jQuery EasyUI 应用 - 创建 CRUD 应用 数据收集并妥善管理数据是网络应用常见的必要功能。CRUD(Create 创建、Read 读取、Update 更新、Delete 删除)允许我们生成页面来列表显示并编辑数据库记录。本教程将演示如何使用 jQuery EasyUI 框架实现一个基本…

张小明 2026/1/1 9:42:34 网站建设

肥城网站建设推广自助建站系统凡科

NanaZip完全指南:现代Windows压缩工具快速上手 【免费下载链接】NanaZip The 7-Zip derivative intended for the modern Windows experience 项目地址: https://gitcode.com/gh_mirrors/na/NanaZip NanaZip是一款专为现代Windows体验设计的开源文件压缩工具…

张小明 2025/12/30 10:32:15 网站建设

o2o与网站建设个人网站可以做c2c吗

waifu2x-caffe终极指南:AI图像放大与智能降噪技术深度解析 【免费下载链接】waifu2x-caffe lltcggie/waifu2x-caffe: Waifu2x-Caffe 是一个用于图像放大和降噪的 Python 库,使用了 Caffe 深度学习框架,可以用于图像处理和计算机视觉任务&…

张小明 2025/12/30 13:17:42 网站建设

网站3d展示怎么做wordpress 标签不显示

C 语言进阶之避坑指南:多重 if-else 及多重条件混乱 —— 让逻辑不再 “绕迷宫” 一、多重 if-else 的 “逻辑迷宫”,你被困住了吗? “修改一个条件,整个功能逻辑全部错乱?” “多重 if-else 嵌套十几层,代码像绕迷宫,查 BUG 时看到头大?” “多个条件组合判断时,…

张小明 2026/1/1 4:54:37 网站建设

广州知名网站建设有哪些WordPress附件图片弹窗

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个高效的Python语法检查与优化工具,主要功能:1. 批量语法检查;2. 代码风格自动优化;3. 性能瓶颈检测;4. 一键修复建…

张小明 2026/1/1 15:24:52 网站建设