我們都知道在Java程式使用SQL語法帶參數查詢資料庫時,應該用參數化查詢(Parameterized query),即PreparedStatement
及佔位符(placeholder)?
來傳入參數來避免SQL Injection(SQL隱碼攻擊)漏洞。
PreparedStatement查詢
PreparedStatement ps = conn.prepareStatement("select * from EMPLOYEE where id = ?");
ps.setString(1, "A0001");
ResultSet rs = ps.executeQuery();
因為PreparedStatement在執行SQL查詢前,會先將傳入參數中具有SQL特殊功能的符號或關鍵字給跳脫掉,像是||
、&
、AND
、OR
等,也就是說這些含特殊字的參數不會成為SQL語法的一部分,如此就可以避免惡意人士藉由傳入能改變SQL語意(即SQL Injection)來取得敏感資料或更改資料庫的狀態等。
沒有留言:
張貼留言