1. 程式人生 > 其它 >什麼是 SQL 注入攻擊?

什麼是 SQL 注入攻擊?

SQL 注入就是通過把 SQL 命令插入到 Web 表單提交或輸入域名或頁面請求的查詢字串,伺服器拿到這個字串之後,會把這個字串作為 sql 的執行引數去資料庫查詢,然而這個引數是惡意的,以至於伺服器執行這條 sql 命令之後,出現了問題。

下面直接弄個案例吧,這樣容易理解一些。

比如,在一個登入介面,要求輸入使用者名稱和密碼,可以這樣輸入實現免帳號登入:

使用者名稱: ‘or 1 = 1 --
密 碼:

使用者一旦點選登入,如若沒有做特殊處理,那麼這個非法使用者就很得意的登陸進去了。

這是為什麼呢?

下面我們分析一下:從理論上說,後臺認證程式中可能會有如下的SQL語句:

String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”;

注:可以左右拉動,下同

因此,當輸入了上面的使用者名稱和密碼,把引數代進去,則上面的SQL語句變成:

SELECT * FROM user_table WHERE username=’’or 1 = 1 –- and password=’’

分析上述SQL語句我們知道,username=‘ or 1=1 這個語句一定會成功;然後後面加兩個-,在 sql 中,兩個 -這意味著註釋,它將後面的語句註釋,讓他們不起作用。這樣,後面的and password=’’語句將不會執行,所以上述語句永遠都能正確執行,使用者輕易騙過系統,獲取合法身份。

應對方法

(1). 引數繫結

使用預編譯手段,繫結引數是最好的防SQL注入的方法。目前許多的 ORM 框架及 JDBC 等都實現了 SQL 預編譯和引數繫結功能,攻擊者的惡意SQL會被當做SQL 的引數而不是 SQL 命令被執行。

在mybatis的mapper檔案中,對於傳遞的引數我們一般是使用 # 和$來獲取引數值。

當使用#時,變數是佔位符,就是一般我們使用 javajdbc 的 PrepareStatement 時的佔位符,所有可以防止 sql 注入;當使用 $時,變數就是直接追加在sql中,一般會有 sql 注入問題。

(2). 使用正則表示式過濾傳入的引數,例如把出現雙-的過濾掉等等。