C# 使用Parameter來避免SQL Injection問題

一般常用的SQL查詢語法,若有需要Client端指定參數名稱,都是使用組字串的方式來達成,但若遇到使用者輸入的資料包含了特殊符號,尤其是單引號,SQL就會出錯,嚴重還會有資安的問題,最好的方法就是使用Parameter的方式來加入參數,這個方法最大的好處是,若資料包含單引號,系統也不會有問題,也可以正常將單引號寫入Table(類以系統自己將1個單引號取代為2個單引號後寫入Table)。

範例如下(使用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


留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記