C# 强化vs DataContractJsonSerializer
针对C#/.NET项目运行HP Fortify。将JSON文档从Web源提供给.NET的C# 强化vs DataContractJsonSerializer,c#,json,fortify,C#,Json,Fortify,针对C#/.NET项目运行HP Fortify。将JSON文档从Web源提供给.NET的DataContractJsonSerializer会触发Fortify中的“JSON注入”问题 以下代码段将导致该错误: WebClient wc = new WebClient(); string s = wc.DownloadString(SomeURL); using (MemoryStream mst = new MemoryStream(Encoding.UTF8.GetBytes(s)))
DataContractJsonSerializer
会触发Fortify中的“JSON注入”问题
以下代码段将导致该错误:
WebClient wc = new WebClient();
string s = wc.DownloadString(SomeURL);
using (MemoryStream mst = new MemoryStream(Encoding.UTF8.GetBytes(s)))
return new DataContractJsonSerializer(typeof(SomeType)).ReadObject(mst) as SomeType;
Fortify这样反序列化JSON有什么问题?这门课在.NET中已经有一段时间了
编辑:引用描述:
eval()
EDIT2:另一个.NET的JSON读取器,
JavaScriptSerializer
,在强化中不会导致错误。奇怪。检查是否有日期被交换,json的data contact serializer尝试将日期处理为日期(…)
嵌入命令,而不是iso字符串抱歉,但我不同意:
->解析的风险在哪里?除非解析器是window.eval(),否则没有风险。如果字符串格式不正确,解析器将抛出异常
这里的实际抱怨不是直接针对解析器,而是传递给解析器的值。您假设正在读取/传递的数据是JSON还是非JSON,如果是后者,则会导致异常,但是,您忽略了一个重要点,即可能存在危险的有效JSON,这可能会影响您的程序逻辑,或导致其他严重漏洞
如果你想通过考试,有一点你没有注意到:
如果
应用程序从未验证的输入构造JSON。以相对的方式
在良性情况下,攻击者可能会插入无关元素
这会导致应用程序在解析JSON时引发异常
文件或请求。在更严重的情况下,例如
涉及JSON注入,攻击者可以插入无关的
允许可预测的业务操作的元素
JSON文档或请求中的关键值。在某些情况下,JSON
注入可能导致跨站点脚本编写或动态代码评估
因此,在当前代码中,string s=wc.DownloadString(SomeURL)代码>是问题的潜在原因。在将该字符串流式传输到内存之前,您应该检查其是否健全。如上所述,在严重情况下,可以插入可能影响业务逻辑的无关元素。显然,这是静态代码分析器可以为您做的您知道此处将传递哪些数据,但Fortify不知道/不能知道。毕竟,Fortify是一个静态代码分析器
因此,如果您希望Fortify不再抱怨,请对字符串进行健全性检查,如基于JSON数据的跨站点脚本攻击测试等。如果您确定您的字符串将始终保持干净,则可以禁止显示此警告。另外,作为一个补充点,我认为(至少对我来说)使用静态代码分析器工具遇到这些问题是显而易见的。您可以在Fortify Analyzer中阅读描述;IMO最可能的原因是新的MemoryStream(Encoding.UTF8.GetBytes(s))
——没有对字符串进行验证!我希望对字符串应用什么样的验证?这是一个JSON。解析是验证.Hi@SevaAlekseyev的第一步-正如我在第一条评论中所说的,它警告您,因为没有对字符串s进行健全检查(这些是静态代码分析器是有原因的)。如果您认为此警告不会影响您的应用程序/代码,则可以取消显示此警告。仍然无法获取此警告。在解析复杂对象图之前,如何对其JSON执行健全性检查?我知道我可以抑制它;这不是重点。对不起,如果我不清楚我想让你明白的是什么实际上是在传达!您应该检查值wc.DownloadString(SomeURL)
的健全性。检查结果字符串是否格式不正确,等等,以避免常见漏洞!希望有帮助,没有。再说一遍,Fortify是静态的,不知道这一点。这就是说,如果它处理日期的方式确实是一个通用的安全漏洞,那么微软现在就不会解决它了吗?来自Fortify供应商wo的引用