如何在调用方法中获取CA2100 SQL注入警告

How to get CA2100 SQL injection warning in calling methods

提问人:chris 提问时间:10/9/2020 更新时间:10/9/2020 访问量:209

问:

我有一个辅助方法可以防止大量复制和粘贴。我想确保根据规则“CA2100:查看 SQL 查询是否存在安全漏洞”检查我的帮助程序方法“MyExecuteSQLQuery”的调用方法。我怎样才能做到这一点?

换句话说,我想收到类似情况的 CA2100 警告:

MyExecuteSQLQuery("update credentials set password = '" + password +"' where id = " + id);

辅助方法:

public static int MyExecuteSQLQuery(string sql, int timeout = 30)
{
    using (MySqlConnection con = new MySqlConnection(DBConnectionstring))
    {
        con.Open();
        using (MySqlCommand cmd = new MySqlCommand(sql, con))
        {
            if (timeout != 30)
            {
                cmd.CommandTimeout = timeout;
            }

            return cmd.ExecuteNonQuery();
        }
    }
}
C# SQL SQL注入 FXCOP

评论

4赞 Damien_The_Unbeliever 10/9/2020
你从根本上破坏了人们避免SQL注入的最佳能力,坚持将整个查询作为单个字符串提交。避免注入的最强方法是使用参数。
0赞 mjwills 10/9/2020
您是否考虑过使用像 Dapper 这样的东西而不是添加这样的方法?
0赞 chris 10/9/2020
@Damien_The_Unbeliever我还有一个带参数的帮助程序方法,但我想确保没有人会使用这个有SQL注入风险的帮助程序方法。

答:

1赞 ste-fu 10/9/2020 #1

我不认为这是个好主意。我想可以将您的方法添加到分析器中,但重构您的方法以取而代之可能更容易,也许是这样的:MySqlCommand

public static int MyExecuteSQLQuery(MySqlCommand cmd, int timeout = 30)
{
    using (MySqlConnection con = new MySqlConnection(DBConnectionstring))
    {
        con.Open();
        cmd.CommandTimeout = timeout;
        
        return cmd.ExecuteNonQuery();
    }
}

}

然后,当您构建MySqlCommand

评论

1赞 chris 10/9/2020
好吧,但这样称呼它更好:using (var sql = new MySqlCommand(“update x set a=1 where b=2”)) MyExecuteSQLQuery(sql);`}MyExecuteSQLQuery("update x set a=1 where b=2"); instead of: {