我已经开始使用SonarQube进行静态分析。它向我报告了很多SQL注入漏洞,但它看起来像是false positive
。
让我们说需要在数据库上运行程序。程序名称取自配置。
SonarQube正在报道:
Make sure to sanitize the parameters of this SQL command.
示例代码:
using (SqlCommand cmd = new SqlCommand(procName, Connection))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@param", SqlDbType.NVarChar, 32)).Value = record;
using (SqlDataReader dr = cmd.ExecuteReader())
{
}
}
可以在程序名称上注入任何SQL吗?该名称是否需要消毒?
答案 0 :(得分:1)
我承认S3649的实现并不是最聪明的,如果将非常量字符串传递给CommandText
的{{1}}属性,则会引发问题,或者相应的ctor论证。
如果您确定SqlCommand
的值不是来自潜在可利用的来源,例如例如,查询字符串参数,处理此特定问题的最佳方法是在SonarQube中将其标记为CommandText
。如果您还在连接模式下使用SonarLint进行此项目,它将自动禁止该问题显示在IDE中。
另一方面,如果值可能来自可利用的来源,例如查询字符串参数,请求正文,cookie,标题等,则设置Won't Fix
仍然不足以阻止攻击者执行数据库上的存储过程与您预期的不同...在这种情况下,如果为存储过程创建单独的包装器方法可能会更好,从而防止潜在的攻击者选择要执行的其他SP。