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

ASP.NET Bad Practices: Non-Serializable Object Stored in Session

我有这样的代码

Session["key"] = "value";

但是根据 Fortify SCA,它被认为是一种不好的做法,原因是 "Non-Serializable Object Stored in Session"。

截图如下:

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

我认为这是误报。

来自Fortify document

In order for the session to be serialized correctly, all objects the application stores as session attributes must declare the [Serializable] attribute. Additionally, if the object requires custom serialization methods, it must also implement the ISerializable interface.

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

不要相信它是误报。最好为此做点什么。我从 Fortify 得到了同样的报告。为了修复它,当我尝试设置会话变量时,我首先 运行 通过一个我知道已序列化的对象的字符串。 class 看起来像这样:

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;
        }
    }
}

那么class可以这样使用:

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

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