定義:以使用者或者外部的輸入動態構造sql查詢的命令,將可能改變sql查詢語句本來的語義,從而導致執行任意的sql命令,洩露或者篡改sql資料庫的敏感資料。
基本例子:
原sql:string name = request.getparameter("name"); … resultset rs = conn.createstatement().executequery("select data from users where name = '"+name+"'");
篡改後:resultset rs = conn.createstatement().executequery("select data from users where name = 『joe』 or 『1』 = 『1』);
有操作風險的api函式:
–statement.execute*
–preparedstatement.execute*
–callablestatement.execute*
–jdbctemplate.query*
–jdbctemplate.insert
–jdbctemplate.update
–jdbctemplate.delete
–jdbctemplate.execute
–session.createquery
– session.createsqlquery
–session.createfilter"
防治思想:
1、輸入校驗:做好規範的校驗工作,比如搜尋框不能輸入sql語句等;
2、許可權控制:在建立乙個sql資料庫的使用者帳戶時,要遵循最低許可權法則。使用者應只擁有使用其帳戶的必要的最低特權。如果系統顯示需要使用者可以讀取和修改自己的資料,那麼應該限制其特權,使他們無法讀取/編寫別人的資料。
3、重複校驗:在伺服器端重複客戶端所進行的所有過濾。(黑名單驗證和白名單驗證)
例子:public static void main(string args) throws ioexception else }}
4、動態引數:應使用prepared statements語句繫結變數來執行sql字串。沒有使用prepared statements語句繫結變數可能很容易受到攻擊。
使用嚴格的白名單型來檢查可以用於sol命令的所有使用者輸入資料。而不是避開元字符集,完全禁止元字元才是最安全的。原因是:後期對已經被輸入資料庫的資料進行使用可能將之前使用過的元字元丟棄。應該對request中期望的安全的字符集進行更為精細地定義。
如何防止SQL注入
一 sql注入攻擊的簡單示例 statement select from users where value a variable 上面這條語句是很普通的一條sql語句,主要實現的功能就是讓使用者輸入乙個員工編號然後查詢這個員工的資訊。但是若這條語句被不法攻擊者改裝過後,就可能成為破壞資料的 如攻擊...
如何防止SQL注入
歸納一下,主要有以下幾點 1.永遠不要信任使用者的輸入。對使用者的輸入進行校驗,可以通過正規表示式,或限制長度 對單引號和雙 進行轉換等。2.永遠不要使用動態拼裝sql,可以使用引數化的sql或者直接使用儲存過程進行資料查詢訪問。3.永遠不要使用管理員許可權的資料庫連線,為每個應用使用單獨的許可權有...
如何防止sql注入
一 什麼是sql注入?sql注入就是利用現有應用程式,將 惡意 的sql命令注入到後台資料庫引擎執行的能力。二 sql注入攻擊過程分為五個步驟 第一步 判斷web環境是否可以sql注入 第二步 尋找sql注入點 第三步 猜解使用者名稱和密碼 第四步 尋找web管理後台入口 第五步 入侵和破壞 三 什...