【问题标题】:ASP.NET Bad Practices: Non-Serializable Object Stored in SessionASP.NET 坏习惯:存储在 Session 中的不可序列化对象
【发布时间】:2019-01-08 11:49:30
【问题描述】:

我有一个类似的代码

Session["key"] = "value";

但根据 Fortify SCA 的说法,这是一种不好的做法,原因是“在会话中存储了不可序列化的对象”。

截图如下:

解决此问题的最佳方法是什么? 如何使字符串“value”可序列化?

【问题讨论】:

  • 是什么让您认为 string不可可序列化的?
  • 因为给出了警告。不知何故,它说我的代码不可序列化。
  • 忽略它。这是一场虚惊。
  • 我会说最好将字符串包装到一个类中,而不是忽略警告。此外,我看到您在Session 中有不同的值,因此它们都可以包装到一个类中,标记为[Serializable]

标签: c# serialization fortify


【解决方案1】:

我认为这是误报。

来自Fortify document

为了正确序列化会话,应用程序存储为会话属性的所有对象都必须声明[Serializable] 属性。另外,如果对象需要自定义序列化方法,还必须实现ISerializable接口。

由于string没有实现ISerializable,所以不会通过检查。

【讨论】:

    【解决方案2】:

    不要认为这是误报。最好做点什么。我从 Fortify 那里得到了同样的报告。为了解决这个问题,当我尝试设置会话变量时,我首先通过一个我知道已序列化的对象运行字符串。该类如下所示:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace PMPM.Helpers
    {
        [Serializable]
        public class SessionHelper
        {
            public string SerializedString
            {
                get
                {
                    return serializedStr;
                }
                set
                {
                    serializedStr = value;
                }
            }
            private string serializedStr;
            public SessionHelper(string stringToSerialize)
            {
                serializedStr = stringToSerialize;
            }
        }
    }
    

    那么类可以这样使用:

    Helpers.SessionHelper sessionHelper = new Helpers.SessionHelper("Welcome :" + " " + ds.Rows[0]["PortalWelcome"].ToString());
    Session["UserInput"] = sessionHelper.SerializedString;
    

    这将确保对象被序列化并且也将满足 Fortify。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2010-09-17
      • 2014-08-12
      相关资源
      最近更新 更多