SQL注入漏洞簡單原理
阿新 • • 發佈:2019-02-01
在寫JDBC程式碼執行sql語句的時候可以寫statement或者preparedStatement,前者存在的問題就是有sql注入的漏洞.
SQL注入大致意思就是使用statement執行sql語句的時候會將傳入的字串引數作為SQL語句執行,如果在字串引數中混入了sql關鍵字,就可能導致一些嚴重後果。
比如下圖是一個簡單的登入驗證程式,
資料表中存放了使用者名稱和對應的密碼,登入檢測就是根據使用者傳入的使用者名稱和密碼使用select語句找出username和password都符合使用者傳入引數的結果,如果沒有符合條件的則驗證失敗,否則成功。
(表中有個叫fu的使用者)
可以看到,使用者傳入的引數後面加了 ' or ' 1= 1這句,
結果導致拼接出來的SQL語句變成了
select * from user where username = 'fu' or '1=1' and password = '11111111111'.
在這行sql語句中,會先判斷'1=1' and password = '11111111111'為flase(因為密碼不是111..),
而前面的username='fu'為true,
二者or的結果為真,所以就能查詢到結果,這樣就可以繞過密碼登入進去。
(也可以在fu後面加--這樣可以註釋掉and後面的語句)
package com.imooc.jdbc.demo1; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import com.imooc.jdbc.utils.JDBCUtils; /* * 登入驗證程式驗證sql注入漏洞 */ public class JDBCDemo2 { /* * 測試SQL注入 */ public static void main(String[] args) { boolean flag = JDBCDemo2.login("fu ' or '1=1", "11111111111"); if (flag) { System.out.println("登入成功"); } else { System.out.println("登入失敗"); } } public static boolean login(String username, String password) { Connection conn = null; Statement stmt = null; ResultSet rs = null; boolean flag = false; try { conn = JDBCUtils.getConnection(); stmt = conn.createStatement(); String sql = "select * from user where username = '" + username + "' and password = '" + password + "'"; rs = stmt.executeQuery(sql); if(rs.next()) { flag = true; } else { flag = false; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { JDBCUtils.release(rs, stmt, conn); } return flag; } }