国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - 數據庫技術 - 實例介紹SQL注入以及如何解決

實例介紹SQL注入以及如何解決

2021-12-09 16:12耿小廚 數據庫技術

這篇文章主要給大家介紹了關于SQL注入以及如何解決的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

1、sql注入案例

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 創建一張用戶表
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 編寫一個登錄程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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("用戶名或密碼錯誤,請重新輸入!!!");
  }
 
 
  preparedstatement.close();
  resultset.close();
  // smt.close();
  conn.close();
 
 }
 
}

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注入以及如何解決的文章就介紹到這了,更多相關sql注入及解決內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/gjc592/p/14167666.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日日干夜夜操 | 精品国产一区探花在线观看 | 一区二区三区欧美 | 成人午夜影院 | 亚洲欧洲免费视频 | 日韩和的一区二在线 | 精品久久久久久国产 | 国产一区二区视频在线 | 激情综合网站 | 亚洲欧美制服诱惑 | 热99久久| 欧美激情区 | 中文字幕色 | 中文字幕在线观看精品视频 | 欧美午夜一区二区三区免费大片 | 偷拍做爰吃奶视频免费看 | 国产精品免费一区二区 | 国产中文字幕观看 | 伊人中文字幕 | 正在播放国产精品 | 性色综合 | 日韩成人 | 日韩成人精品 | 日韩在线精品视频 | 日韩欧美在线一区二区 | 亚洲免费观看 | 国产精品美女久久久久久免费 | 中文字幕日韩欧美 | 91成人精品 | 男人午夜视频在线观看 | 国产一区二区视频精品 | 久久国产一区二区 | 中日韩欧美风情视频 | 成人3d动漫一区二区三区91 | 欧美国产精品一区二区三区 | 欧美国产激情二区三区 | 欧美日韩精品一区 | 国产精品不卡视频 | 日韩一区二区在线播放 | 天天色av| 国产在线精品一区二区三区 |