c# - 不可信数据的反序列化
问题描述
在我们代码库的安全运行中,我们遇到了一个高优先级问题,即“不可信数据的反序列化”我们正在使用 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;
}
解决方案
您可以使用JsonConvert.PopulateObject(sourceJsonString, obj)
代替反序列化它JsonConvert.DesrializeObject<>();
。
推荐阅读
- linux - 根据 bash 中给出的键进行排序
- android - Firebase动态链接同步?
- sql-server - 如何将格式为 MM-DD-YYYY 的日期更改为在 SSIS 中的 MM 和 DD 中没有前导零?
- nginx - 通过 nginx 提供静态文件时如何修复 404 错误
- c# - 为什么 DbContext.Attach 将实体状态设置为 EntityState.Modified?
- javascript - 使用 Node js 验证 Google ID 令牌
- gensim - word2vec - KeyError:“单词 X 不在词汇表中”
- asp.net - 来自 Mac OS 共享文件夹的 IIS 站点
- regex - 从文件中提取文本,直到 perl 中的匹配行
- typescript - 在 NestJS 中将服务注入到控制器函数中