SQL 注入露洞相關知識整理

 上上個星期,有人反饋,CSDN有SQL注入露洞,汗顏,幾年前爲SQL注入露洞,部門專門對所有代碼做過一次非常大的檢查,竟然那次檢查還有遺漏的地方。最近這幾個星期,就是一直再對代碼做再次複查,看有沒有SQL注入露洞。

        存在SQL注入露洞,就因爲你的SQL語句是自己拼湊的,在拼湊的時候,沒有考慮用戶可能拼湊進有問題的語句造成的。

        之前我們採去的避免措施是,對接受的參數的校驗進行封裝,所有參數的獲得,都必須通過這個封裝的函數來獲得。但是實際開發中,總有些地方,有些代碼沒有調用這個封裝的函數來進行校驗。

        上週末,公司內部討論會的時候,決定換種思路。從避免自己拼湊SQL語句的方式來實現,具體就是開發規範中有一條,不允許用拼湊的SQL語句,要傳參數,就用SqlParameter。比如下面的代碼是不允許的。

string strSQL = "select UserID,UserName,Email from User where UserName = '"+aa.replace("'","''")+"'";
SqlDataReader sdr = SqlHelper.ExecuteReader(strConnStr,CommandType.Text,strSQL)

而下面的代碼是允許的:

SqlParameter[] parm1 = new SqlParameter[]{
 new SqlParameter("@UserName",SqlDbType.NVarChar,50)
 };
parm1[0].Value = strUserName;
string strSQL = "select UserID,UserName,Email from user where UserName = @UserName ";
SqlDataReader sdr = SqlHelper.ExecuteReader(strConnStr,CommandType.Text,strSQL,parm1)

原因:SqlParameter 會自動處理參數的校驗,就類似使用存儲過程是不會出現SQL注入露洞的問題一樣。


一些SQL注入有關的知識點:
如何SQL注入:
http://www.54nb.com/Read.Asp?ID=1451672&Type=71
SQL注入中有用的幾個SQL語句
[N] = 第N個表
ID=1 and (Select top 1 name from(Select top [N] id,name from sysobjects where xtype=char(85)) T order by id desc)>1
[T] = 表名
[N] = 第N個字段
ID=1 and (Select Top 1 col_name(object_id('[T]'),[N]) from sysobjects)>1
SQL注入表名和字段名的獲得

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章