SQL注入
用戶輸入的內容, 在SQL語句拼接過程中, 完成了一條邏輯發生變化的新的SQL語句 !
例如:
原SQL語句拼接為:
String sql = "select id from user15 where username='"+user.getUserName()+"' and password='"+user.getPassWord()+"'";
用戶輸入的帳號密碼分別為:
請輸入您的帳號:
suibian
請輸入您的密碼:
suibian' or '1'='1
組成的SQL語句:
select id from user15 where username='suibian' and password='suibian' or '1'='1'
解決SQL注入問題
使用預編譯SQL語句 進行參數的傳遞
更改執行環境 Statement
使用新的環境: PreparedStatement
在通過連接對象 獲取一個預編譯的SQL環境(PreparedStatement)時, 需要傳遞 一個SQL語句 !
在這個語句中 可以出現? , ? 表示准備填充的參數值!
使用步驟:
1. 通過連接對象, 獲得一個預編譯的SQL執行環境
PreparedStatement state conn.prepareStatement(sql);
例如:
String sql = "select id from user15 where username=? and password=?";
PreparedStatement state = conn.prepareStatement(sql);
2. 向預編譯參數列表中 傳遞值:
預編譯的SQL語句中可以包含0-n個問號, 每一個問號表示一個需要傳遞的值
我們通過PreparedStatement它的setXXX方法,來完成參數的傳遞
在傳遞參數時, 需要指定問號的索引, 問號的索引從1開始
例如:
state.setString(1,user.getUserName());
state.setString(2,user.getPassWord());
3. 執行語句:
ResultSet result = state.executeQuery();
PreparedStatement
常用方法:
填充預編譯的參數:
- setXXX(問號索引,值)
向預編譯的SQL的?中傳遞值
參數1. 問號的索引 ,從1開始
參數2. 填充到? 中的值
- execute()
- executeUpdate();
- executeQuery();
上面的三個方法 與 Statement中方法的含義一致, 只不過不存在參數!