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

SQL注入怎么解決

136次閱讀
沒有評論

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

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

丸趣 TV 小編給大家分享一下 SQL 注入怎么解決,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

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

1、SQL 注入案例

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

1.1 數據庫中先創建用戶表及數據

--  創建一張用戶表
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 編寫一個登錄程序

package com.study.task0201;
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);
 //  獲取語句執行平臺對象  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( 用戶名或密碼錯誤,請重新輸入!!! }
 resultSet.close();
 smt.close();
 conn.close();
 }
}

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 進行處理。

2.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);
 //  獲取語句執行平臺對象  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 的主要區別如下:

Statement 用于執行靜態 SQL 語句,在執行時,必須指定一個事先準備好的 SQL 語句

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

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

以上是“SQL 注入怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計3313字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 郧西县| 武隆县| 常德市| 洪江市| 平阴县| 文山县| 灵璧县| 胶州市| 麻阳| 永仁县| 夹江县| 合肥市| 乌拉特前旗| 林甸县| 唐山市| 潞西市| 南通市| 涿州市| 共和县| 永修县| 华坪县| 麦盖提县| 冕宁县| 宁海县| 镇康县| 泽库县| 康乐县| 通化市| 门源| 上栗县| 绥化市| 宝应县| 抚顺县| 洪泽县| 兴海县| 桃源县| 罗源县| 大同县| 邯郸市| 商城县| 江山市|