C# 使用Parameter來避免SQL Injection問題
一般常用的SQL查詢語法,若有需要Client端指定參數名稱,都是使用組字串的方式來達成,但若遇到使用者輸入的資料包含了特殊符號,尤其是單引號,SQL就會出錯,嚴重還會有資安的問題,最好的方法就是使用Parameter的方式來加入參數,這個方法最大的好處是,若資料包含單引號,系統也不會有問題,也可以正常將單引號寫入Table(類以系統自己將1個單引號取代為2個單引號後寫入Table)。
範例如下(使用MSSQL為範例):
範例如下(使用MSSQL為範例):
string sql = "select * from table where a = :a"; using (OleDbConnection Conn = new OleDbConnection(_dbConnString)) { Conn.Open(); using (OleDbCommand oraCmd = new OleDbCommand(sql, Conn)) { oraCmd.Parameters.Add("a", OleDbType.VarChar, 20).Value = "1234"; OleDbDataAdapter da = new OleDbDataAdapter(oraCmd); DataSet ds = new DataSet(); da.Fill(ds); DataTable dtResult = ds.Tables[0]; Console.WriteLine("data row = " + dtResult.Rows.Count.ToString()); Console.ReadKey(); } Conn.Close(); }
而SQL的Parameter符號依每個資料庫或連線方式而有所不同。
- .Net For Oracle:使用冒號(:) + Parameter名稱 (若傳入空字串,要先轉為DBNull.Value)
- .Net For MSSQL:使用小老鼠(@) + Parameter名稱
- ODBC:使用問號(?),因為不需指定Parameter名稱,所以是依序配對
refference web:
http://stackoverflow.com/questions/11048910/oraclecommand-sql-parameters-binding
http://www.dotblogs.com.tw/jeff-yeh/archive/2009/06/22/8946.aspx
http://www.dotblogs.com.tw/jeff-yeh/archive/2009/06/22/8946.aspx
留言
張貼留言