sql注入問題

java.sql.PreparedStatement(SQL預處理)

                                                              防止SQL注入

                                                              只要你的sql參數是用戶提供過來的都需要使用sql預處理

                                                              設置參數的時候需要選擇對應數據類型進行設置,要不然處理類型的時候會有問題

                                                              setObject 此方法有一個好處就是,你可以給它任何類型,自己進行類型判斷,識別你的類型進行設置

sql防注入代碼舉例:

import java.sql.*;
import java.util.Arrays;
import java.util.Scanner;

public class T4 {

    public static void main(String[] args) throws SQLException {
        java.util.Scanner input = new Scanner(System.in);
        System.out.print("請輸入您的登錄賬號:");
        String Account = input.next();
        System.out.print("請輸入您的登錄密碼:");
        String Password = input.next();
        Connection connection = T3.getT3().getconnection();
         Statement statement = connection.createStatement();
              PreparedStatement pst = connection.prepareCall("select *from zangu where account=? AND password=?");
        // 用Connection對象中的prepareCall類來接收sql語句  再創建PreparedStatement接口對象
            pst.setString(1, Account);
        //通過PreparedStatement類來調用其中的setString方法你要輸人的是第幾個 這裏我們選擇的是String類型所以輸入的是字符串類型
        //當然你也可以選擇PreparedStatement中的int方法
          pst.setString(2, Password);
        //這裏原理同上通過PreparedStatement類來調用其中的setString方法你要輸人的是第幾個 並輸入類型
         ResultSet resultSet = pst.executeQuery();
        //通過PreparedStatement 創建查詢
        //這裏創建ResultSet記錄集對象類接受查詢號的 resultSet記錄集
          statement.executeUpdate("create table zangu(zid int(11)primary key,account varchar(100)," +
                "password varchar(100))engine=innodb charset=utf8");//創建表只允許一次,注意如果在調用這個類又會創建一次就會報錯
             statement.executeUpdate("insert into zangu values(1,'張三','123456') ");
                ResultSet resultSet = statement.executeQuery("select *from zangu where account='"+
                      Account+"'and password='"+Password+"'");//這樣子驗證存在sql注入問題 ‘ or ''=' 這樣會從本質上改寫代碼sql防注入批處理添加
        PreparedStatement/*注意這個是批處理的類*/ pst = connection.prepareStatement("INSERT into zangu values(?,?,?)");
        pst.setObject(1, 2);
        pst.setObject(2, "李四");
        pst.setString(3, "0");
        pst.addBatch();//執行批處理每局代碼後面都要調用這個方法

        pst.setObject(1, 3);
        pst.setObject(2, "趙六");
        pst.setObject(3, "125");
        pst.addBatch();

        pst.setObject(1, 4);
        pst.setObject(2, "嘻嘻哈哈");
        pst.setObject(3, "315");
        pst.addBatch();
        int a[] = pst.executeBatch();//調處批處理接過叫給數組啊
        System.out.println(Arrays.toString(a));//打印記錄
    }
}


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