我创建了一个方法,它将SQL查询作为参数传入并返回结果。我知道我应该使用参数化查询来避免SQL注入。但是我的问题是,当我将查询作为字符串参数传递时,我该如何做到这一点?
例如,这是我将要调用的一个方法:
public static DataTable SqlDataTable(string sql)
{
using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Connection.Open();
DataTable TempTable = new DataTable();
TempTable.Load(cmd.ExecuteReader());
return TempTable;
}
}
因此,从另一个文件中,我想这样使用该方法:
DataTable dt = new DataTable();
dt = SqlComm.SqlDataTable("SELECT * FROM Users WHERE UserName='" + login.Text + "' and Password='" + password.Text + "'");
if (dt.Rows.Count > 0)
{
// do something if the query returns rows
}
这样做仍然容易受到注入攻击,对吗?有没有方法可以将变量作为参数传递给字符串?如果我为查询创建一个新的SQLCommand对象并使用Parameters.AddWithValue,我知道我可以这样做,但我希望所有的SQL命令都在单独的类中。