。Net Core中默认情况下字符串是否不可序列化?

问题描述 投票:1回答:1

我正在其他方面审查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中,默认情况下字符串是否不可序列化?您的见解将不胜感激。谢谢。

c# string .net-core fortify static-code-analysis
1个回答
0
投票

我对此的研究表明,这是一个误报。两年前有一个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]属性,除非您要为序列化的属性指定自定义名称,并且类本身也不需要任何类型的属性。

© www.soinside.com 2019 - 2024. All rights reserved.