Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强化vs DataContractJsonSerializer_C#_Json_Fortify - Fatal编程技术网

C# 强化vs DataContractJsonSerializer

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)))

针对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)))
    return new DataContractJsonSerializer(typeof(SomeType)).ReadObject(mst) as SomeType;
Fortify这样反序列化JSON有什么问题?这门课在.NET中已经有一段时间了

编辑:引用描述:

  • 数据从不受信任的源进入程序
  • 在本例中,数据在SF.cs的DownloadString()第43行输入

  • 数据被写入JSON流
  • 在本例中,JSON由SF.cs中的ReadObject()在第45行写入

    应用程序通常使用JSON存储数据或发送消息。什么时候 用于存储数据的JSON通常被视为缓存数据,可能会 可能包含敏感信息。用于发送消息时, JSON通常与RESTful服务结合使用,可以 用于传输敏感信息,如身份验证 证书

    如果 应用程序从未验证的输入构造JSON。以相对的方式 在良性情况下,攻击者可能会插入无关元素 这会导致应用程序在解析JSON时引发异常 文件或请求。在更严重的情况下,例如涉及 JSON注入时,攻击者可能会插入无关元素 允许对关键业务进行可预测的操作 JSON文档或请求中的值。在某些情况下,JSON 注入可能导致跨站点脚本或动态代码评估

    好的,总而言之,恶意JSON的风险是:

  • 例外情况
  • 逻辑操作
  • XSS或动态评估
  • 第一个是期望的行为——如果JSON格式严重错误,应用程序就会举手停止#2是可能的,但是我如何在不进行解析的情况下验证它呢#3是不可能的,因为解析逻辑不是JavaScript
    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的引用