SQL註入攻擊及其解決方法
阿新 • • 發佈:2018-08-22
優勢 相同 res 對象 數據庫服務器 指定 from eight 處理
SQL註入攻擊:
當程序中出現了SQL拼接時,當輸入的值為jack‘#或者‘jack‘ or ‘1=1時,會讓SQL語義發生改變,因為SQL語句中出現了SQL的關鍵字(# or 1=1),造成數據泄露,系統安全隱患。
SQL語義發生改變的語句例如:
select * from user where username=‘jack‘#‘ and password=‘‘
select * from user where username=‘jack‘ or ‘1=1‘ and password=‘‘
解決SQL攻擊:
利用PreparedStatement對象;
//3,獲取帶有預編譯的傳輸器//SQL中包含著?的,叫做SQL骨架。 //? 叫做占位符 String sql = "select * from user where username=? and password=?"; ps = conn.prepareStatement(sql); //設置參數setString //第一個參數必須和問號的順序一致, //第二個參數指定問號的值 ps.setString(1, name); ps.setString(2, pwd); //4,執行SQL rs = ps.executeQuery();
PreparedStatement優勢:
1,防止SQL註入 先把SQL骨架(帶有?的一條SQL,?叫做 占位符)發送給數據庫服務器,然後再把參數發給服務器。 本質上是由於新對象把sql關鍵字給屏蔽了,把SQL關鍵字當做一個普通的文本處理。2,省略了參數拼接的麻煩,通過?作為占位符,通過setString方法來綁定問號的位置,並且賦值來完成的。 3,提高執行效率 先把SQL骨架緩存起來,當下次要訪問相同SQL骨架的業務時,先去緩存中找SQL,緩存中沒有的話,再發出SQL語句查詢數據庫。
SQL註入攻擊及其解決方法