防sql注入常用方法

2021-08-28 02:28:22 字數 1572 閱讀 2682

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 ...