首页 > 解决方案 > 不可信数据的反序列化

问题描述

在我们代码库的安全运行中,我们遇到了一个高优先级问题,即“不可信数据的反序列化”我们正在使用 Newtonsoft JSON 包进行反序列化。下面是使用的代码片段,我按照这个堆栈溢出答案(Fixing the deserializing of untrusted data using C#)来解决这个问题。它仍然没有解决。任何指针都会有所帮助。

var idstate = HttpContext.Current.Request.Form[Constants.State];
var jsonSerializerSettings = new JsonSerializerSettings();                             
LoginRedirection redirectionObject = JsonConvert.DeserializeObject<LoginRedirectionModel>(idstate, jsonSerializerSettings)?.ToLoginRedirection();

用于反序列化的模型如下:-

public class LoginRedirection                                                                        
{
   public string stateUrl { get; set; }
   public string cartSession { get; set; }                                                           
}

public class LoginRedirectionModel                                                                   
{
  public string stateUrl { get; set; }
  public string cartSession { get; set; }

  public LoginRedirection ToLoginRedirection()
  {
    return new LoginRedirection { stateUrl = stateUrl, cartSession = cartSession };
  }                                                                                                  
}

安全异常“OWASP Top 10 2017: A8-Insecure Deserialization”即将出现在下面一行

LoginRedirection redirectionObject = JsonConvert.DeserializeObject<LoginRedirectionModel>(idstate, jsonSerializerSettings)?.ToLoginRedirection();

JSON:-

{ "stateUrl"="<URL HERE>", "cartSession":"<GUID HERE>"}

问题的另一个方面是:- 当我们使用 HttpClient 使用 API,然后尝试反序列化来自 API 的响应时,我们会收到相同的安全警告。下面是使用和反序列化 API 的代码。

public T Post<T, M>(M data, string url, bool ocpSubscriptionHeaderRequired = true)
{
  T response = default(T);
  try
  {       
    string postBody = JsonConvert.SerializeObject(data);        

    using (var client = new HttpClient() { Timeout = TimeSpan.FromSeconds(ApiRequestTimeOutInSeconds) })
    {
      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

      if (ocpSubscriptionHeaderRequired)
      {
        client.DefaultRequestHeaders.Remove(Constants.ApiSubscriptionKey);
        client.DefaultRequestHeaders.Add(Constants.ApiSubscriptionKey, GenericUtilities.GetConfigData(Constants.ApiSubscriptionKeyValue));
      }

      HttpResponseMessage result = Task.Run(() => client.PostAsync(url, new StringContent(postBody, Encoding.UTF8, "application/json"))).Result;
      if (result.IsSuccessStatusCode)
      {
        string responseString = Task.Run(() => result.Content.ReadAsStringAsync()).Result;
        response = JsonConvert.DeserializeObject<T>(responseString, new JsonSerializerSettings()
                                                                           { 
                                                                                TypeNameHandling = TypeNameHandling.None 
                                                                           });            
      }          
    }
  }
  catch (Exception ex)
  {        
    _logger.WriteException(ex);        
  }
  return response;
}

标签: c#json.netdeserializationjson-deserialization

解决方案


您可以使用JsonConvert.PopulateObject(sourceJsonString, obj)代替反序列化它JsonConvert.DesrializeObject<>();


推荐阅读