java模擬一次簡單的sql注入


在數據庫中生成 一個用戶表  有用戶名 username 和密碼password 字段 並插入兩組數據

正常的sql查詢結果

非正常查詢途徑返回的結果

 

 下面用一段java代碼 演示一下用戶登錄時的sql注入問題

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import com.mysql.jdbc.Driver;

/*
 * Java程序實現用戶登錄,用戶名和密碼,數據庫檢查
 * 演示被別人攻擊
 */
public class JDBCDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.注冊驅動
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接
        String url="jdbc:mysql://localhost:3306/mybase";
        String username="root";
        String password="123456";
        Connection conn=DriverManager.getConnection(url,username,password);
        //3.創建方法執行對象
        Statement stat=conn.createStatement();
        
        Scanner sc=new Scanner(System.in);
        System.out.print("請輸入用戶名:");
        String user=sc.nextLine();
        System.out.print("請輸入密碼:");
        String pwd=sc.nextLine();
        
        //執行SQL語句,數據表,查詢用戶名和密碼,如果存在,登陸成功,不存在登陸失敗
        String sql="select * from users where username='"+user+"' and password='"+pwd+"'";
        System.out.println(sql);
        ResultSet rs=stat.executeQuery(sql);
        while(rs.next()){
            System.out.println(rs.getString("username")+"  "+rs.getString("password"));
        }
        
        rs.close();
        stat.close();
        conn.close();
    }
}

控制台輸入 輸出

 剛剛控制台輸入的用戶名是存在的

下面輸入瞎寫的用戶名和密碼同樣可以得到所有用戶名和對應的密碼,此謂sql的注入攻擊

解決方式,使用Statement的子類接口 PrepareStatement

該接口是由數據庫廠商提供實現類方法,我們直接調用即可,使用這個子類接口,完美解決了上述問題,所以成為java 連接數據庫執行的一個標准步驟

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

/*
 * Java程序實現用戶登錄,用戶名和密碼,數據庫檢查
 * 防止注入攻擊
 * Statement 接口實現類,作用執行SQL語句,返回結果集
 * 有一個子接口PreparedStatement (SQL預編譯存儲,多次高效的執行SQL)
 * PreparedStatement prepareStatement(String sql)
 * 
 */
public class JDBCDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://localhost:3306/mybase";
        String username="root";
        String password="123456";
        Connection con=DriverManager.getConnection(url,username,password);
        Scanner sc=new Scanner(System.in);
        System.out.println("請輸入用戶名:");
        String user=sc.nextLine();
        System.out.println("請輸入密碼:");
        String pwd=sc.nextLine();
        String sql="select * from users where username=? and password=?";
        PreparedStatement ps=con.prepareStatement(sql);
        ps.setObject(1, user);
        ps.setObject(2, pwd);
        
        ResultSet rs=ps.executeQuery();
        while(rs.next()){
            System.out.println(rs.getString("username")+"   "+rs.getShort("password"));
        }
        rs.close();
        ps.close();
        con.close();
        
    }
}

正確輸入后的輸出

故技重施:來一次sql注入

發覺根本不行!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM