【问题标题】:Fixing the deserializing of untrusted data using C#使用 C# 修复不可信数据的反序列化
【发布时间】:2019-03-05 00:28:29
【问题描述】:

我有以下相关的 C# 代码:

json = File.ReadAllText(path);
isStudentObject= JsonConvert.DeserializeObject<List<XXStudentCode>>(json).Any(sv => sv.SCODE.Equals(code));

我的安全软件(静态代码分析)扫描我们的应用程序,它不喜欢上面的代码,即 ReadAllText 部分。它说这是“不可信数据的高风险反序列化”。

所以我的问题是:如何重构此代码以使数据“可信”?我尝试了不同的验证方法,但没有奏效。任何帮助表示赞赏。

【问题讨论】:

  • 这与 JSON 无关,问题在于尝试从(可能)不受信任的位置读取文件
  • 安全软件有没有更多提示?上次我修复了 curse-fest 的安全漏洞时,我最终编写了一个文件和路径名清理程序,我认为我们做了一些事情来断言哪些路径是安全的
  • 不,实际上是它给我的唯一错误。它说什么:“结果 = Common_High_Risk.Deserialization_of_Untrusted_Data();”
  • 阅读此线程以了解为什么存在此错误的一些很好的示例:security.stackexchange.com/questions/13490/…

标签: c# security


【解决方案1】:

基本上是寻找关闭警告的方法(通过注解或配置文件)。但是,在您这样做之前,请考虑其含义:您应该确保您读取的数据被视为不安全的。换句话说:如果在您的“XXStudentCode”对象中存在某种标志或属性/属性来解锁诸如授予执行某些关键代码或访问私有事物的权限之类的东西,您应该确保在之后不信任该对象序列化。

例如:

class Person
{
    public bool IsAdmin { get; set; }
    public string Name { get; set ; }
}

在上面的示例中,如果输入带有值为 true 的属性“IsAdmin”,并且您的系统将所有具有此属性的“Person's”视为管理员,那么您将存在安全漏洞。为了克服这个问题,您应该创建只包含您真正需要阅读的属性和属性的类。

固定的例子:

class PersonModel
{

    public string Name { get; set ; }

    public Person ToPerson()
    {
        new Person { Name = Name };
    }
}

class Person
{
    public bool IsAdmin { get; set; }
    public string Name { get; set ; }
}

现在,在反序列化中使用 PersonModel,将加载您真正想要的唯一属性,其余的将被序列化库忽略。但是,这不会让您不受安全漏洞的影响。如果反序列化库存在某种安全问题,您也会受到影响。

希望对您有所帮助。

【讨论】:

  • @Derek R 这回答了你的问题吗?如果有请标记它
猜你喜欢
  • 2018-06-01
  • 2020-11-17
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2018-02-18
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多