如何处理此 SQL 注入警告 (CA2100)

How to deal with this SQL injection warning (CA2100)

提问人:Toby D 提问时间:11/6/2017 最后编辑:marc_sToby D 更新时间:7/31/2020 访问量:5280

问:

以下是我从Microsoft页面获得的代码:SqlCommand

public static Int32 ExecuteNonQuery(String connectionString, String commandText, CommandType commandType, params SqlParameter[] parameters)
{
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            using (SqlCommand cmd = new SqlCommand(commandText, conn))
            {
                // There're three command types: StoredProcedure, Text, TableDirect. The TableDirect 
                // type is only for OLE DB.  
                cmd.CommandType = commandType;
                cmd.Parameters.AddRange(parameters);

                conn.Open();
                return cmd.ExecuteNonQuery();
            }
        }
}

但是,VS 代码分析仍然抱怨“CA2100”:

警告 CA2100 传递给“FlexClaimFormRepository.ExecuteNonQuery(string, string, CommandType, params SqlParameter[])”中的“SqlCommand.SqlCommand(string, SqlConnection)”的查询字符串可能包含以下变量“commandText”。如果这些变量中的任何一个可能来自用户输入,请考虑使用存储过程或参数化 SQL 查询,而不是使用字符串连接生成查询。

我知道警告存在的确切原因,但有什么关于如何摆脱它的想法吗?给定在函数中设置 commandText 是不可接受的,因为我希望它是一个参数。

.NET SQL 注入 CA2202

评论

0赞 Toby D 11/6/2017
对不起,这是CA2100。我已经更新了标题。
0赞 Maciej Los 11/6/2017
好的。向我们展示示例查询。同时,请参阅: CA2100:查看 SQL 查询是否存在安全漏洞
0赞 Toby D 11/6/2017
我不认为我们在这里需要示例查询,因为 VS 代码分析只会给出相同的警告。
2赞 Stefan Steinegger 11/6/2017
当您确定该命令不是来自用户输入或其他类型的“外部”时,您可以安全地禁止它。
1赞 Nick.Mc 11/6/2017
如果是可以用任意 SQL 填充的自由文本,例如 ,那么最好的办法是确保此应用程序仅与只读用户连接。例如,通过将用户添加到角色。不过,VS 代码分析不会识别这一点。commandTextUPDATE Salary SET Amount = Amount * 1000 WHERE Person='Me'db_datareader

答:

3赞 Kevin Dykema 11/28/2019 #1

我知道这个问题很老,但也许这会帮助有同样问题的人。我还使用了存储过程,因此使用本文中的信息禁止显示警告 Microsoft: https://learn.microsoft.com/en-us/visualstudio/code-quality/in-source-suppression-overview?view=vs-2019 .

这是我添加到方法中的属性:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Security", "CA2100:Review SQL queries for security vulnerabilities", Justification = "Method already uses a Stored Procedure")]