oracle引數查詢避免SQL注入
阿新 • • 發佈:2019-01-11
前言。
可以參考上一篇轉載的文章,這裡只做簡單介紹。
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。 比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊.
原理
SQL注入攻擊指的是通過構建特殊的輸入作為引數傳入Web應用程式,而這些輸入大都是SQL語法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。 根據相關技術原理,SQL注入可以分為平臺層注入和程式碼層注入。前者由不安全的資料庫配置或資料庫平臺的漏洞所致;後者主要是由於程式設計師對輸入未進行細緻地過濾,從而執行了非法的資料查詢。基於此,SQL注入的產生原因通常表現在以下幾方面:①不當的型別處理;②不安全的防護
歸納一下,主要有以下幾點: 1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正則表示式,或限制長度;對單引號和 雙"-"進行轉換等。 2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢存取。 3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有限的資料庫連線。 4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。 5.應用的異常資訊應該給出儘可能少的提示,最好使用自定義的在這裡我採用的是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增加本次要賦予的引數,不能遺漏,如果遺漏會提示:引數未全部繫結。最後兩句程式碼是驗證本次讀出的資料是否正確。
此處程式碼執行正確無誤。