PreparedStatement,註冊攻擊,模擬用戶登錄

JDBC-模擬用戶登錄

案例需求:
  模擬用戶登錄,Statement對象完成
開發步驟:
  1.準備環境,導入JDBCUtils工具類,mysql-connector-java-5.1.10-bin.jar包,JUnit 4 jar包 
  2.創建main方法,提示用戶登錄
  3.創建login方法,用來驗證用戶是否存在,去查詢user表,根據用戶名和密碼,利用jdbc完成,JDBCUtils工具類
  
方式一:當我們的用戶名輸入的值爲jack’# /jack’ or’1=1’時會產生一新現象:只輸入用戶名不輸入密碼可以登錄成功。
本質上是因爲SQL中出現了SQL關鍵字(# / or),使得SQL語義發生了變化。出現SQL注入攻擊問題, 
 
方式二:給出瞭解決方案,利用PreparedeStatement對象開發,可以成功的避免攻擊問題

總結:1.防止 SQL注入攻擊問題,本質上是將SQL的關鍵字當做一個普通的字符串來處理的。
2.省去了參數拼接的麻煩,利用?來作爲佔位符,將SQL的參數和SQL的骨架分隔開。?的值通過ps.setString(index,username)
3.提高程序的效率,執行sql的時候,先將SQL骨架緩存,減少了數據庫的交互提高程序訪問效率
用戶表:
這裏寫圖片描述

代碼實現如下

package on.login_用戶登錄;

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

import on.tedu.Util_工具類.JDBCUtils;

/**
 * 這個類用來模擬用戶登錄
 * 開發步驟:
 * 1.創建main方法,提示用戶登錄
 * 2.創建login方法,用來驗證用戶是否存在
 * 
 * @date 2018年3月26日
 *
 */
public class LoginUser {

    //1.創建main方法,提示用戶登錄
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);    
        System.out.println("請您輸入用戶名:");
        String username = sc.nextLine();
        System.out.println("請您輸入密碼:");
        String password =sc.nextLine();
        //2.創建login方法,用來驗證用戶是否存在
        login(username,password);

    }

    //用來驗證用戶是否存在
    //去查詢user表,根據用戶名和密碼
    private static void login(String username, String password) {
        Connection conn=null;
        Statement st=null;
        ResultSet rs=null;
        //利用可以防止SQL注入攻擊的對象
        PreparedStatement ps =null;
        try {
            //利用jdbc完成,JDBCUtils工具類完成
            //1.獲取數據庫連接
            conn= JDBCUtils.getConnection();
            //2.獲取傳輸器
            //st=conn.createStatement();

            /**
             * 方式一產生了注入攻擊問題 jack'# 和 jack' or '1=1
             */
            //3.執行SQL
            /*  String sql="select * from user where username='"+username+"' and password='"+password+"'";
                rs=st.executeQuery(sql);*/

            //自己的思路
            /*          String name=null;
            String pass=null;
            while(rs.next()){
                 name=rs.getString(2);
                 pass=rs.getString(3);
            }*/

            /**
             * 方式二:PerparedStatement對象
             * 執行SQL
             */
            //利用connection對象產生PerparedStatement預編譯傳輸器對象
            //? 叫做佔位符 ,SQL的名字叫做骨架
            String sql ="select * from user where username=? and password=?";
            ps=conn.prepareStatement(sql);
            //設置參數值,數字的順序和 ? 的順序一致
            ps.setString(1, username);//匹配第一個?要輸入的值
            ps.setString(2, password);
            rs= ps.executeQuery();

            //4.解析結果集
            if(rs.next()){
                System.out.println("恭喜您,登錄成功!");
            }else{
                System.out.println("用戶名和密碼輸入錯誤!請重新輸入");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            //5.關閉資源
            JDBCUtils.close(conn, st, rs);
        }
    }
}

運行結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章