sql注入是黑客通過**注入(前端表單、url等),攻擊資料庫的一種手段。簡單的說,可以將資料庫語句區分成編譯前和編譯後兩種狀態,sql注入攻擊資料庫,只對編譯前的sql有作用。
舉個栗子:乙個校驗使用者登入的sql語句。
select id,name from user where username = 'a' and password = 'b';
其中a和b是傳入的引數,正常情況通過該語句進行密碼校驗沒啥問題。
假設a的引數被人攔截,模擬資料請求 a 的值設為 ' or 1=1 -- 那麼該語句將變成 ;
select id,name from user where name = '1' or 1=1 -- and password = 'b';
從圖中可以很明細的看出 -- 後的語句被注釋掉,同時通過or 1=1 可以查詢出所有的賬號和密碼 ,輕而易舉的登入系統,當然這只是乙個簡單的例子,如果將a替換成 '; drop ***,可以將整個資料庫刪除。
select id,name from user where name = '1'; drop *** -- and password = 'b';
以下簡單介紹幾種防sql注入的方法,知道了sql注入的原理我們可以通過避免這類語句的插入來達到防注入的目的:
1、簡單通過,正規表示式和字串過濾等,過濾掉存在 『 、-- 、;、等這裡字串。
private string checksql = 「^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$」;
public static boolean sql_inj(string str)
}return false;
}
2、也可以通過js前端校驗表單提交的資料內容。
3、通過jdbc預編譯好的sql語句進行防注入,通過 佔位符 ?,通過引數傳遞的方式,編譯後的語句無法進行sql注入。
string sql= "select * from user where username=? and password=?;
preparedstatement prestate = conn.preparestatement(sql);
prestate.setstring(1, username);
prestate.setstring(2, password);
resultset rs = prestate.executequery();
採用預編譯語句集,它內建了處理sql注入的能力,只要使用它的set***方法傳值即可。
使用好處:
原理:4、通過呼叫現有的框架,hibernate、mybatis他們已經內建過濾了部分的sql注入。
通過mybatis呼叫資料庫,用#進行引數傳遞,他可以事先將sql語句編譯好,通過佔位符 ?進行引數傳遞,編譯後的sql是無法進行sql注入的。我們開發時應盡量使用 # ,在開發中對於表名、欄位名不可避免的用到$ 進行引數傳遞,由於他是後編譯的,我們應在引數傳遞時做好字元過濾。
防sql注入方法
一 什麼是sql注入 sql注入是比較常見的網路攻擊方式之一,它不是利用作業系統的bug進行攻擊,而是通過程式設計 的疏漏,通過編寫特定的sql語句,進行資料庫的非法訪問。二 sql注入流程 尋找sql注入位置 判斷伺服器型別和後台資料型別 針對不同的伺服器和資料庫特點進行sql注入 三 防sql注...
防SQL注入
這段 有好處也有壞處,用的時候得小心,搞不好就會跳進錯誤 dimsql injdata sql injdata and exec insert select delete update chr mid master truncate char declare sql inj split sql in...
防SQL注入
1.必須認定使用者輸入的資料都是不安全的 使用者輸入的資料進行過濾處理 if preg match w get username matches else 讓我們看下在沒有過濾特殊字元時,出現的sql情況 設定 name 中插入了我們不需要的sql語句 name qadir delete from ...