C# 调用方法时如何获取CA2100 SQL注入警告
我有一个助手方法来防止大量的复制和粘贴。我想确保我的助手方法“MyExecuteSQLQuery”的调用方法将根据规则“CA2100:检查SQL查询的安全漏洞”进行检查。我怎样才能做到这一点 换句话说,我想得到一个CA2100警告:C# 调用方法时如何获取CA2100 SQL注入警告,c#,sql,sql-injection,fxcop,C#,Sql,Sql Injection,Fxcop,我有一个助手方法来防止大量的复制和粘贴。我想确保我的助手方法“MyExecuteSQLQuery”的调用方法将根据规则“CA2100:检查SQL查询的安全漏洞”进行检查。我怎样才能做到这一点 换句话说,我想得到一个CA2100警告: MyExecuteSQLQuery("update credentials set password = '" + password +"' where id = " + id); 助手方法: public static i
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();
}
}
}
我认为这不是个好主意。我认为可以将您的方法添加到分析器中,但是重构您的方法以采用
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
时,您会收到错误/警告。我认为这不是一个好主意。我认为可以将您的方法添加到分析器中,但是重构您的方法以采用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
时,您会收到错误/警告您坚持将整个查询作为单个字符串提交,这从根本上打破了人们避免SQL注入的最佳能力。避免注入的最有效的方法是使用参数。你有没有考虑过使用像Dapper这样的方法而不是添加这样的方法?@Damien_The_unsiver我还有一个带有参数的helper方法,但是我想确保没有人会使用这个有SQL注入风险的助手方法。通过坚持将整个查询作为单个字符串提交,从根本上打破了人们避免SQL注入的最佳能力。避免注入的最有效的方法是使用参数。您是否考虑过使用像Dapper这样的方法而不是添加这样的方法?@Damien_The_Unsivers我也有一个带参数的helper方法,但我想确保没有人会使用这个helper方法而冒着SQL注入的风险。嗯,但这样称呼它更好:MyExecuteSQLQuery(“更新x集a=1,其中b=2”);而不是:
使用(var sql=new MySqlCommand(“update x set a=1,其中b=2”)){
MyExecuteSQLQuery(sql);`}好吧,但这样称呼它更好:MyExecuteSQLQuery(“update x set a=1,其中b=2”);而不是:
使用(var sql=new MySqlCommand(“update x set a=1,其中b=2”)){
MyExecuteSQLQuery(sql);`}