HP Fortify:ASP.NET 不良做法:存储在会话中的不可序列化对象

Posted

技术标签:

【中文标题】HP Fortify:ASP.NET 不良做法:存储在会话中的不可序列化对象【英文标题】:HP Fortify : ASP.NET Bad Practices: Non-Serializable Object Stored in Session 【发布时间】:2016-10-18 18:05:54 【问题描述】:

HttpContextHelper.cs 中的 set_UserActiveEnvironments() 方法在第 47 行将不可序列化的对象存储为 HttpSessionState 属性,这会损害应用程序的可靠性

默认情况下,ASP.NET 服务器将 HttpSessionState 对象、其属性和它们引用的任何对象存储在内存中。此模型将活动会话状态限制为单个机器的系统内存可以容纳的状态。为了在这些限制之外扩展容量,服务器经常被配置为持久会话状态信息,这既扩展了容量又允许跨多台机器进行复制以提高整体性能。为了持久化其会话状态,服务器必须序列化 HttpSessionState 对象,这要求存储在其中的所有对象都是可序列化的。

为什么将其显示为漏洞,我该如何修复它?

【问题讨论】:

【参考方案1】:

我认为 Fortify 在 C# 中误解了 set_accessor_declaration。发现似乎 Fortify 无法将 value 关键字的类型链接到属性的类型。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#accessors

试图将发现解释为好像 Session 属性本身需要一个 Serializable 属性似乎是错误的。一篇关于 ASP.NET 中不同序列化模式的操作指南文章告诉我,会话序列化适用于 Session 属性的内容,而不是整个属性。

https://www.codeproject.com/Articles/32545/Exploring-Session-in-ASP-Net

【讨论】:

【参考方案2】:

Mohanraj,也许您已经找到了解决方案,但下面是一个合理的解释:

HP Fortify 表明存在一些误报,这就是为什么您需要逐个分析它指出的每个漏洞,这就是为什么它有一个分类列表供您分析发现的漏洞是否属于真正的威胁或误报。

在这种特殊情况下,要修复漏洞,您只需将尝试传输/发送到 Session 的类装饰为 [Serializable],这在使用 session 将数据存储在应用程序中时非常推荐。

查看 Piet Obermeyer 和 Jonathan Hawkins 的 this article,它更好地解释了序列化的使用。

希望这会有所帮助。

【讨论】:

HttpContext.Current.Session["PageName"] = "This Page";如何将字符串标记为可序列化?我已经通过 String pageName = "This Page"; HttpContext.Current.Session["PageName"] = pageName;也是。它不会让我使用没有报告的高脆弱性的字符串。我认为字符串应该是可序列化的。

以上是关于HP Fortify:ASP.NET 不良做法:存储在会话中的不可序列化对象的主要内容,如果未能解决你的问题,请参考以下文章

从 asp.net 上的 Fortify 扫描打开重定向或标题操作问题

HP Fortify Cookie头操作错误

HP Fortify -- 注释方法参数

HP fortify XML 外部实体注入

HP Fortify 路径操作验证规则

HP Fortify 规则抑制属性 C#