3 回答

TA貢獻1856條經(jīng)驗 獲得超11個贊
這行得通,但仍然容易受到注射的侵害吧?
是的,您的代碼非常容易受到SQL注入的攻擊。
我知道我應(yīng)該使用參數(shù)化查詢來避免SQL注入。
哦,是的。
我的問題是,當(dāng)我將查詢作為字符串參數(shù)傳遞時,該怎么辦?
您根本不應(yīng)該將查詢作為字符串參數(shù)傳遞。相反,您應(yīng)該將查詢作為包含占位符和這些占位符值的字符串參數(shù)傳遞:
public static DataTable SqlDataTable(string sql, IDictionary<string, object> values)
{
using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
using (SqlCommand cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = sql;
foreach (KeyValuePair<string, object> item in values)
{
cmd.Parameters.AddWithValue("@" + item.Key, item.Value);
}
DataTable table = new DataTable();
using (var reader = cmd.ExecuteReader())
{
table.Load(reader);
return table;
}
}
}
然后像這樣使用您的函數(shù):
DataTable dt = SqlComm.SqlDataTable(
"SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password",
new Dictionary<string, object>
{
{ "UserName", login.Text },
{ "Password", password.Text },
}
);
if (dt.Rows.Count > 0)
{
// do something if the query returns rows
}

TA貢獻1811條經(jīng)驗 獲得超6個贊
您走在正確的道路上,我實際上也已經(jīng)完成了您在尋找自己的事情。但是,我不僅傳遞字符串給函數(shù),還傳遞了SQL Command對象...這樣,您可以正確構(gòu)建所有命令和參數(shù),然后說...在這里,運行它,準(zhǔn)備出發(fā)了。就像是
public static DataTable SqlDataTable(SqlCommand cmd)
{
using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
{
cmd.Connection = conn; // store your connection to the command object..
cmd.Connection.Open();
DataTable TempTable = new DataTable();
TempTable.Load(cmd.ExecuteReader());
return TempTable;
}
}
public DataTable GetMyCustomers(string likeName)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select * from SomeTable where LastName like "@someParm%";
cmd.Parameters.Add( "whateverParm", likeName ); // don't have SQL with me now, guessing syntax
// so now your SQL Command is all built with parameters and ready to go.
return SqlDataTable( cmd );
}
- 3 回答
- 0 關(guān)注
- 656 瀏覽
添加回答
舉報