SQL 注入漏洞存在的原因,就是拼接 SQL 參數。也就是將用於輸入的查詢參數,直接拼接在 SQL 語句中,導致了SQL 注入漏洞。
簡單來說,就是別人可以通過你的語法漏洞向你的數據庫隨便添加數據
解決辦法:
采用sql語句預編譯和綁定變量,是防御sql注入的最佳方法
String sql = "select id, no from user where id=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, id); ps.executeQuery();
其原因就是:采用了PreparedStatement,就會將sql語句:"select id, no from user where id=?" 預先編譯好,也就是SQL引擎會預先進行語法分析,產生語法樹,生成執行計划,
也就是說,后面你輸入的參數,無論你輸入的是什么,都不會影響該sql語句的 語法結構了,因為語法分析已經完成了,而語法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面輸入了這些sql命令,也不會被當成sql命令來執行了,因為這些sql命令的執行, 必須先的通過語法分析,生成執行計划,
既然語法分析已經完成,已經預編譯過了,那么后面輸入的參數,是絕對不可能作為sql命令來執行的,只會被當做字符串字面值參數。所以sql語句預編譯可以防御sql注入。