1. 程式人生 > >oracle引數查詢避免SQL注入

oracle引數查詢避免SQL注入

前言。

可以參考上一篇轉載的文章,這裡只做簡單介紹。

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。 比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊

原理

SQL注入攻擊指的是通過構建特殊的輸入作為引數傳入Web應用程式,而這些輸入大都是SQL語法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。 根據相關技術原理,SQL注入可以分為平臺層注入和程式碼層注入。前者由不安全的資料庫配置或資料庫平臺的漏洞所致;後者主要是由於程式設計師對輸入未進行細緻地過濾,從而執行了非法的資料查詢。基於此,SQL注入的產生原因通常表現在以下幾方面:①不當的型別處理;②不安全的
資料
庫配置;③不合理的查詢集處理;④不當的錯誤處理;⑤轉義字元處理不合適;⑥多個提交處理不當。 當應用程式使用輸入內容來構造動態sql語句以訪問資料庫時,會發生sql注入攻擊。如果程式碼使用儲存過程,而這些儲存過程作為包含未篩選的使用者輸入的字串來傳遞,也會發生sql注入。sql注入可能導致攻擊者使用應用程式登陸在資料庫中執行命令。相關的SQL注入可以通過測試工具pangolin進行。如果應用程式使用特權過高的帳戶連線到資料庫,這種問題會變得很嚴重。在某些表單中,使用者輸入的內容直接用來構造動態sql命令,或者作為儲存過程的輸入引數,這些表單特別容易受到sql注入的攻擊。而許多網站程式在編寫時,沒有對使用者輸入的合法性進行判斷或者程式中本身的
變數
處理不當,使應用程式存在安全隱患。這樣,使用者就可以提交一段資料庫查詢的程式碼,根據程式返回的結果,獲得一些敏感的資訊或者控制整個伺服器,於是sql注入就發生了。

防護

歸納一下,主要有以下幾點: 1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正則表示式,或限制長度;對單引號和 雙"-"進行轉換等。 2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。 3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。 4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。 5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的
錯誤資訊
對原始錯誤資訊進行包裝 6.sql注入的檢測方法一般採取輔助軟體或網站平臺來檢測,軟體一般採用sql注入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。 介紹結束。

在這裡我採用的是SQL引數化查詢,之前也蒐集了很多資料,總體比較混亂,先貼上本次的程式碼:

String sqlSearchTagName1 = string.Format("SELECT DISTINCT \"DataTable\".\"Name\" FROM \"DataTable\" WHERE \"Name\"=:pName");
上面這句程式碼與平時寫的語句相比,要特別關注
:pName
這個是引數的名字。
  OracleParameter param = new OracleParameter(":pName",OracleDbType.Varchar2,40, "zhangsan");
  param.Value = ("zhangsan");
上面這兩句程式碼是給引數:pName賦予屬性和值。
 dbCmd = new OracleCommand(sqlSearchName1, conn);
            dbCmd.Parameters.Add(param);
            dbCmd.CommandType = CommandType.Text;
            dataAdapter = new OracleDataAdapter();
            dataAdapter.SelectCommand = dbCmd;
            dtPointData.Clear();
            dataAdapter.Fill(dtPointData);
            DataTable tableSelectName1 = dtPointData;
           string aaa= tableSelectName1.Rows[0][0].ToString();
上面這幾句程式碼要特別注意第二句,給dbCmd增加本次要賦予的引數,不能遺漏,如果遺漏會提示:引數未全部繫結。最後兩句程式碼是驗證本次讀出的資料是否正確。

此處程式碼執行正確無誤。