【发布时间】:2020-11-17 20:40:25
【问题描述】:
在我们代码库的安全运行中,我们遇到了一个高优先级问题,即“不可信数据的反序列化”我们正在使用 Newtonsoft JSON 包进行反序列化。下面是使用的代码 sn-p,我按照这个堆栈溢出答案(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;
}
【问题讨论】:
-
您到底从谁(哪个静态分析器)和哪一行得到了什么(哪个错误)?
-
您要反序列化哪个 JSON?
-
JSON 只有两个属性,请参阅我的问题中的“LoginRedirection”类。安全异常“OWASP Top 10 2017: A8-Insecure Deserialization”出现在 LoginRedirection redirectionObject = JsonConvert.DeserializeObject
(idstate, jsonSerializerSettings)?.ToLoginRedirection(); 行 -
@AlokBhatt 将信息添加到问题本身。评论只是 cmets。它们可以随时删除,并且注释中编写的代码非常难以阅读,除非它是半行
-
@AlokBhatt 您链接到的问题的答案也很清楚-您必须考虑问题是什么,需要什么以及可以做些什么来解决它,而不仅仅是复制一些随机代码。在您的情况下,重定向 URL 是如何出现在 JSON 字符串中的?这个字符串是从哪里来的?如果它是从登录页面发布的,有人可以重写该页面的 Javascript 以将重定向 URL 替换为其他内容吗?
标签: c# json.net deserialization json-deserialization