我正在其他方面审查Fortify静态分析安全性测试(SAST)扫描报告,以识别和抑制误报。该应用程序框架是C#.NET Core。 SAST报告的部分内容:
“ Method1()在第111行上将不可序列化的对象存储为HttpSessionState属性,这可能会损坏应用程序的可靠性。将不可序列化的对象存储为HttpSessionState属性会破坏应用程序的可靠性”
第111行的代码如下:
Session[key] = Request.QueryString["abcd"];
我打算将这个问题抑制为误报,因为我们存储的是字符串对象,并且默认情况下字符串是可序列化的。但是后来我研究发现“字符串默认情况下是可序列化的”仅在.NET框架中是正确的,因为字符串定义是用.NET中的Serializable属性修饰的。然而,在.NET Core中,字符串定义未使用Serializable属性修饰。
因此,因为这是一个.NET Core应用程序,所以Fortify SAST断言正确吗?在.NET Core中,默认情况下字符串是否不可序列化?您的见解将不胜感激。谢谢。
我对此的研究表明,这是一个误报。两年前有一个similar question给您,有几个答案也得出相似的结论,但我对此进行了更多研究。
序列化时的原始.NET Framework documentation表示,该对象作为一个整体标记为[Serializable]
属性,在这种情况下没有标记其中的属性(您的字符串),但它本身并不直接说到字符串。
就是说,.NET Core的原始版本实际上直到.NET Core 2.0才真正支持二进制序列化的[Serializable]
属性。但是,在该发行版中,尽管仍建议使用其他序列化框架,但您可以阅读将System.String引用为受支持的可序列化类型的documentation(请参阅该页面顶部警告下的段落)。
。NET Core有关序列化的文档分为几篇不同的文章,但是再次,您可以看到,在Basic Serialization文档中,它再次表明该类本身已被标记(不是string属性,尽管它具有一个示例),并且还指示它将成功序列化。
根据最后引用:
[Serializable]
public class MyObject {
public int n1 = 0;
public int n2 = 0;
public String str = null;
}
以及那些将字符串写入适当属性并进行相应序列化的文档中的逻辑。
MyObject obj = new MyObject();
obj.n1 = 1;
obj.n2 = 24;
obj.str = "Some String";
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
stream.Close();
因此,我得出结论,只要您使用带有二进制序列化的.NET Core 2.0,.NET Standard 2.0或newer并将其使用的类标记为[Serializable]
属性,这确实是一个误报。否则,请检查您正在使用的序列化框架的要求,以查看其是否需要任何此类属性修饰(例如,Newtonsoft.Json不需要在属性上使用[JsonProperty]
属性,除非您要为序列化的属性指定自定义名称,并且类本身也不需要任何类型的属性。