Fortify Json .NET 注入
Fortify Json Injection in .NET
我正在使用 Newtonsoft.Json 反序列化 json 字符串,但 fortify 抱怨我使用的是未经验证的 json。然后我使用 Newtonsoft.Json.Schema 添加了一个检查,但它现在抱怨更多
var schema = JsonSchema.Parse(JsonConvert.SerializeObject(typeof(T)));
JToken token = JArray.Parse(json); -- Vulnerability
IList<string> errors;
if (token.IsValid(schema, out errors))
{
return JsonConvert.DeserializeObject<T>(json); -- Vulnerability
}
关于如何验证 Json 字符串有什么建议吗?
On line 23 of , the method DeserializeObject() writes
unvalidated input into JSON. This call could allow an attacker to
inject arbitrary elements or attributes into the JSON entity.
在你的情况下,Fortify 似乎抱怨你使用来自不受信任来源的 json
,这就是 Fortify documentation:
中所说的
The semantics of JSON documents and messages can be altered if an application constructs JSON from unvalidated input. In a relatively benign case, an attacker may be able to insert extraneous elements that cause an application to throw an exception while parsing a JSON document or request. In a more serious case, such as that involving JSON injection, an attacker may be able to insert extraneous elements that allow for the predictable manipulation of business critical values within a JSON document or request.
如果您从您拥有的 Web 服务收到 json
,您可以忽略 Fortify 的警告。但是,请记住,您正在对输入调用 JArray.Parse()
并假定它将是一个有效数组,但如果不是,您将得到 JsonReaderException
。此外,您并没有真正根据架构验证 JSON,请参阅 JSON.NET example 了解如何指定 JSON 架构。
老实说,我很想知道 Fortify 如何期望人们验证从某些第三方 Web 服务收到的 JSON。
抱歉回复晚了,我设法fix/deceive加强了。这是修复
byte[] jsonBytes = Encoding.UTF8.GetBytes(json);
using (var stream = new MemoryStream(jsonBytes))
{
output = Deserialize<List<T>>(stream);
}
public TResult Deserialize<TResult>(Stream responseStream)
{
using (var sr = new StreamReader(responseStream))
{
using (var reader = new JsonTextReader(sr))
{
var serializer = new JsonSerializer
{
MissingMemberHandling =
EnforceMissingMemberHandling ? MissingMemberHandling.Error : MissingMemberHandling.Ignore,
NullValueHandling = IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include
};
return serializer.Deserialize<TResult>(reader);
}
}
}
希望这对某人有所帮助
如果有人仍在寻找解决方案,我已经完成了以下操作,它似乎按预期工作。
1 使用在线工具获取 JSON 样本和推断模式。
2 在解析或反序列化之前添加一个单独的方法来验证 JSON。
3 在使用 Schema 验证 JSON 之后,然后继续正常操作,无论你想做什么。
我正在使用 Newtonsoft.Json 反序列化 json 字符串,但 fortify 抱怨我使用的是未经验证的 json。然后我使用 Newtonsoft.Json.Schema 添加了一个检查,但它现在抱怨更多
var schema = JsonSchema.Parse(JsonConvert.SerializeObject(typeof(T)));
JToken token = JArray.Parse(json); -- Vulnerability
IList<string> errors;
if (token.IsValid(schema, out errors))
{
return JsonConvert.DeserializeObject<T>(json); -- Vulnerability
}
关于如何验证 Json 字符串有什么建议吗?
On line 23 of , the method DeserializeObject() writes unvalidated input into JSON. This call could allow an attacker to inject arbitrary elements or attributes into the JSON entity.
在你的情况下,Fortify 似乎抱怨你使用来自不受信任来源的 json
,这就是 Fortify documentation:
The semantics of JSON documents and messages can be altered if an application constructs JSON from unvalidated input. In a relatively benign case, an attacker may be able to insert extraneous elements that cause an application to throw an exception while parsing a JSON document or request. In a more serious case, such as that involving JSON injection, an attacker may be able to insert extraneous elements that allow for the predictable manipulation of business critical values within a JSON document or request.
如果您从您拥有的 Web 服务收到 json
,您可以忽略 Fortify 的警告。但是,请记住,您正在对输入调用 JArray.Parse()
并假定它将是一个有效数组,但如果不是,您将得到 JsonReaderException
。此外,您并没有真正根据架构验证 JSON,请参阅 JSON.NET example 了解如何指定 JSON 架构。
老实说,我很想知道 Fortify 如何期望人们验证从某些第三方 Web 服务收到的 JSON。
抱歉回复晚了,我设法fix/deceive加强了。这是修复
byte[] jsonBytes = Encoding.UTF8.GetBytes(json);
using (var stream = new MemoryStream(jsonBytes))
{
output = Deserialize<List<T>>(stream);
}
public TResult Deserialize<TResult>(Stream responseStream)
{
using (var sr = new StreamReader(responseStream))
{
using (var reader = new JsonTextReader(sr))
{
var serializer = new JsonSerializer
{
MissingMemberHandling =
EnforceMissingMemberHandling ? MissingMemberHandling.Error : MissingMemberHandling.Ignore,
NullValueHandling = IgnoreNullValues ? NullValueHandling.Ignore : NullValueHandling.Include
};
return serializer.Deserialize<TResult>(reader);
}
}
}
希望这对某人有所帮助
如果有人仍在寻找解决方案,我已经完成了以下操作,它似乎按预期工作。