我正在将Fortify静态代码分析器用于C#/。NET项目。我从用户输入中获取一个整数参数,即一年,并以此为起点:
int y = int.Parse(Year.SelectedValue); //Year is a DropDownList
if (y >= 2017 && y <= DateTime.Today.Year)
Process.Start(new ProcessStartInfo(Server.MapPath("~/bin/SomeProgram.exe"), "/x:" + y.ToString()));
Fortify不喜欢那样,会引发“命令注入”问题:
- 数据从不受信任的来源进入应用程序。
在这种情况下,数据在ccc.aspx.cs中的get_SelectedValue()处输入 第25行。即使这种情况下的数据是数字,也是如此 未经验证,因此仍然被认为是恶意的,因此 该漏洞仍在报告中,但优先级值降低了。
- 数据用作表示应用程序执行的命令的字符串或作为字符串的一部分。
在这种情况下,命令由ProcessStartInfo()在 ccc.aspx.cs在第28行。
从字面上看,有两个可能导致流程启动的输入值(截至撰写本文时)为2017年和2018年。如果if()语句不算作Fortify的验证,那会是什么?
编辑:最重要的是,除非您明确选择ASP.NET的ViewState完整性检查,否则DropDownList
不允许超出指定范围的值。考虑到这一点,我不明白为什么SelectedValue
中的DropDownList
首先被视为不受信任的来源。
答案 0 :(得分:2)
将其标记为误报并继续。
我不认为Fortify将数据类型考虑在内。您正在从string
到int
中取出值,进行验证,然后使用int值而不是原始值。因此,就命令注入而言(在这种情况下)不成问题。
-
什么是验证?
在Fortify方面,构成验证的内容与使Fortify停止对其进行报告的内容之间是有区别的。
不幸的是,在某些情况下(据我使用Fortify 5年以上的经验发现),如果不为分析器编写自定义规则以表明某种方法正在清除数据,就无法满足要求