久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么防止SQL注入

129次閱讀
沒有評論

共計 3239 個字符,預計需要花費 9 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章主要介紹了怎么防止 SQL 注入,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

SQL 注入即是指 web 應用程序對用戶輸入數據的合法性沒有判斷或過濾不嚴,攻擊者可以在 web 應用程序中事先定義好的查詢語句的結尾上添加額外的 SQL 語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙數據庫服務器執(zhí)行非授權的任意查詢,從而進一步得到相應的數據信息。

1、SQL 注入案例

模擬一個用戶登錄的 SQL 注入案例,用戶在控制臺上輸入用戶名和密碼, 然后使用 Statement 字符串拼接的方式實現用戶的登錄。

1.1 數據庫中先創(chuàng)建用戶表及數據

--  創(chuàng)建一張用戶表
CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT,
 `username` VARCHAR(20),
 `password` VARCHAR(50),
 PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

--  插入數據 INSERT INTO users(username,`password`) VALUES(張飛 , 123321),(趙云 , qazxsw),( 諸葛亮 , 123Qwe INSERT INTO users(username,`password`) VALUES(曹操 , 741258),(劉備 , plmokn),( 孫權 , !@#$%^
--  查看數據 SELECT * FROM users;

怎么防止 SQL 注入

1.2 編寫一個登錄程序

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

public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException {  Class.forName( com.mysql.jdbc.Driver  String url =  jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8  Connection conn = DriverManager.getConnection(url, root , 123456  //System.out.println(conn);  //  獲取語句執(zhí)行平臺對象  Statement  Statement smt = conn.createStatement();
 Scanner sc = new Scanner(System.in);  System.out.println( 請輸入用戶名: String userName = sc.nextLine();  System.out.println( 請輸入密碼: String password = sc.nextLine();
 String sql =  select * from users where username =   + userName +   and password =   + password +  // 打印出 SQL  System.out.println(sql);  ResultSet resultSet = smt.executeQuery(sql);  if(resultSet.next()){  System.out.println( 登錄成功!!! }else{  System.out.println( 用戶名或密碼錯誤,請重新輸入!!! }
}

1.3 正常登錄

輸入正確的用戶名及密碼后提示 登錄成功

怎么防止 SQL 注入

1.4 登錄失敗

輸入用戶名或密碼錯誤時,提示“用戶名或密碼錯誤,請重新輸入”

怎么防止 SQL 注入

1.5 模擬 SQL 注入

拼接的字符串中有 or 1 = 1 為恒成立條件,因此 及時前面的用戶及密碼不存在也會取出所有記錄,因此提示 登錄成功

怎么防止 SQL 注入

1.6 SQL 語法報錯

使用拼接的方式,還會出現 SQL 語法錯誤等報錯,例如

怎么防止 SQL 注入

2. 解決方案

使用 Statement 方式,用戶可以通過字符串拼接,改變原本 SQL 真正的含義,導致存在 SQL 注入的風險。解決 SQL 注入,可以通過預處理對象 PreparedStatement 來代替 Statement 進行處理。

1.1 編寫一個新程序

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

public class TestSQLIn { public static void main(String[] args) throws ClassNotFoundException, SQLException {  Class.forName( com.mysql.jdbc.Driver  String url =  jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8  Connection conn = DriverManager.getConnection(url, root , 123456  //System.out.println(conn);  //  獲取語句執(zhí)行平臺對象  Statement  // Statement smt = conn.createStatement();
 Scanner sc = new Scanner(System.in);  System.out.println( 請輸入用戶名: String userName = sc.nextLine();  System.out.println( 請輸入密碼: String password = sc.nextLine();
 String sql =  select * from users where username = ? and password = ?   // System.out.println(sql);  // ResultSet resultSet = smt.executeQuery(sql);  PreparedStatement preparedStatement = conn.prepareStatement(sql);  preparedStatement.setString(1,userName);  preparedStatement.setString(2,password);
 ResultSet resultSet = preparedStatement.executeQuery();  if(resultSet.next()){  System.out.println( 登錄成功!!! }else{  System.out.println( 用戶名或密碼錯誤,請重新輸入!!! }
}

2.2 正常登錄

怎么防止 SQL 注入

2.3 用戶名密碼錯誤

當用戶名或密碼輸入錯誤時,會提示“用戶名或密碼錯誤,請重新輸入”

怎么防止 SQL 注入

2.4 模擬 SQL 注入

按照之前的情況,進行 SQL 注入的寫法,測試后不再出現 SQL 注入情況。

怎么防止 SQL 注入

2.5 模擬 SQL 語法錯誤

使用預處理類后,輸入帶有單引號或雙引號的內容也不會再出現 SQL 語法錯誤的報錯

怎么防止 SQL 注入

3. 小結

Statement 與 PreparedStatement 的主要區(qū)別如下:

Statement 用于執(zhí)行靜態(tài) SQL 語句,在執(zhí)行時,必須指定一個事先準備好的 SQL 語句

PrepareStatement 是預編譯的 SQL 語句對象,語句中可以包含動態(tài)參數“?”,在執(zhí)行時可以為“?”動態(tài)設置參數值

PrepareStatement 可以減少編譯次數提高數據庫性能

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“怎么防止 SQL 注入”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業(yè)資訊頻道,更多相關知識等著你來學習!

向 AI 問一下細節(jié)

正文完
 
丸趣
版權聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計3239字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發(fā)布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 泗阳县| 汉沽区| 福贡县| 内江市| 北流市| 临西县| 姜堰市| 和硕县| 镇平县| 易门县| 青岛市| 临夏县| 勃利县| 太康县| 阿坝县| 栾川县| 长顺县| 嘉善县| 河池市| 左云县| 肇源县| 通城县| 永兴县| 商洛市| 屯门区| 大宁县| 华安县| 吴忠市| 克拉玛依市| 景宁| 彩票| 彰化县| 定结县| 商洛市| 南昌市| 西乌珠穆沁旗| 绍兴市| 梁河县| 姚安县| 密山市| 祁东县|