天天看點

使用preparedStatement防止SQL注入

先了解什麼是SQL注入

在使用statement拼接字元串的時候,有一些SQL的特殊關鍵字參與字元串的拼接,這就會造成安全性的問題!

例如:sql = "select * from user where username = ’ "+ username + " 'and password = ’ " + password + " ’ ";

上面的這樣一條SQL語句,在向裡面傳遞參數時,如果登入者登入下面這樣一套使用者密碼:

使用者名:rong(随便寫)
密碼:   a' or 'a' = 'a
           

依然可以實作使用者的登入,而這種密碼稱為SQL注入萬能碼,類似的密碼還有很多,隻需要遵從一定的格式就可以實作登入,繞開SQL語句的驗證.

那為什麼會這樣呢?

當我們這樣登入以後:

select * from user where username = rong and password = a or a =a ;

sql 語句居然變成了上面這樣一條語句,沒錯,我們給where後面的布爾值增添了一個條件*(a = a )這樣的話where後面的值就發生了變化:

username = rong   ---->false
password = a         ----->false 
a = a                      ----- true
而最終結果就是:**false   and   false  or  true  ------------>  true!!!!**
           

是以我們繞開了密碼的檢測,這個時候就可以看出,SQL注入萬能碼為什麼不是唯一的,它的原理就是改變了我們的SQL語句結構,是以隻要符合這種結構,就可以稱為萬能碼;

注:SQL注入輸入惡意攻擊伺服器行為,可以去靶場練習,不可以随便攻擊其他網站,

怎麼使用preparedStatement防止SQL注入

preparedStatement對象可以預編譯SQL語句,參數使用?作為占位符

preparedStatement是Statement的一個子類!通過占位符的使用也就強行限制住了SQL語句傳參時的個數,也就不會被拼接字元串之後or恒為true

使用步驟:

1.導入驅動jar包 mysql-connector - java - 5.1.37-bin.jar

2.注冊驅動

3.擷取資料庫連接配接的對象:Connection

4.定義SQL語句

*  sql語句的參數使用?占位符,例如:
	* select * from user where username = ? and password = ?;
           

5.擷取執行SQL語句的對象PerparedStatement(建立的時候傳遞預編譯SQL語句)

*PerparedStatement Connection.prepareStatement(String SQL)
           

6.給?指派

*setXxx(第幾個站位參數位置,參數内容)
           

7.執行PreparedStatement.executeQuery()方法(不傳參數時執行子類方法,傳遞參數時執行父類方法),接收傳回結果集ResultSet

8.處理結果集

9.關閉資源

注:由此可以看出使用preparedStatement對象更符合JDBC的需求,更安全,效率更高