在.Net Core中,String默认是不可序列化的吗?

问题描述 投票:0回答: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
投票

我对此的研究表明,这是一个假阳性。有一个 类似问题 和你两年前的答案有几个相似的结论,但我又深入研究了一下。

原来的.NET框架 文件 表示对象作为一个整体,在序列化时用 [Serializable] 属性,而不是其中的属性(你的字符串),但它本身并不直接与字符串对话。

也就是说,看起来最初版本的.NET Core其实并不支持在字符串中添加的 [Serializable] 属性的二进制序列化,直到.NET Core 2.0。然而,在该版本中,您可以读取 文件 中引用了System.String作为支持的可序列化类型,尽管它仍然建议使用其他序列化框架(参见该页面顶部警告下的段落)。

.NET Core关于序列化的文档被分割成几篇不同的文章,但同样,你可以看到在 基本序列化 文档,它再次表明类本身已被标记(而不是字符串属性,尽管在示例中它有一个),但也表明它将被成功序列化。

根据最后的引用。

[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或? 较新 的二进制序列化,并将其使用的类用 [Serializable] 属性,否则,请检查您正在使用的序列化框架的要求,看看它是否需要任何这样的属性装饰(例如,Newtonsoft.Json不需要这样的属性。否则,请检查你正在使用的序列化框架的要求,看看它是否需要任何这样的属性装饰(例如,Newtonsoft.Json不需要使用 [JsonProperty] 属性,除非你想为序列化的属性指定自定义名称,也不需要在类本身上设置任何类型的属性)。)

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