JDBC----Statement安全問題與PrepareStatement
1. Statement執行 ,其實是拼接sql語句的。 先拼接sql語句,然後在一起執行。
String sql = "select * from user where username='"+ username +"' and password='"+ password +"'";
UserDao dao = new UserDaoImpl();
dao.login("admin", "100234khsdf88' or '1=1");
SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1'
前面先拼接sql語句, 如果變數裡面帶有了 資料庫的關鍵字,那麼一併認為是關鍵字。 不認為是普通的字串。
rs = st.executeQuery(sql);
2.PrepareStatement:
> 該物件就是替換前面的statement物件。
1. 相比較以前的statement, 預先處理給定的sql語句,對其執行語法檢查。 在sql語句裡面使用 ? 佔位符來替代後續要傳遞進來的變數。 後面進來的變數值,將會被看成是字串,不會產生任何的關鍵字。
String sql = "insert into user values(null , ? , ?)";
ps = conn.prepareStatement(sql);
//給佔位符賦值 從左到右數過來,1 代表第一個問號, 永遠你是1開始。
ps.setString(1, userName);
ps.setString(2, password);