成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java最新SQL注入原因以及預防方案(易理解)

開發(fā) 后端 數據庫
在現有的框架中sql防注入已經做得很好了,我們需要做的就是盡量不要使用sql拼接調用

[[374950]]

 前沿

在現有的框架中sql防注入已經做得很好了,我們需要做的就是盡量不要使用sql拼接調用

java sql注入原因以及預防方案(易理解)

1. SQL注入

1.1 原理

SQL注入是通過客戶端的輸入把SQL命令注入到一個應用的數據庫中,從而執(zhí)行惡意的SQL語句。

1.2 演示

1.2.1 案例1

有一個登錄框,需要 輸入用戶名和密碼 ,然后我們的密碼輸入 'or '123' = '123 這樣的。我們在查詢用戶名和密碼是否正確的時候,本來執(zhí)行的sql語句是:select * from user where username = '' and password = ''. 這樣的sql語句,現在我們輸入密碼是如上這樣的,然后我們會通過參數進行拼接,拼接后的sql語句就是:

select * from user where username = '' and password = ' ' or '123' = '123 ';這樣的了,那么會有一個or語句,只要這兩個有一個是正確的話,就條件成立,因此 123 = 123 是成立的。因此驗證就會被跳過。這只是一個簡單的例子,

1.2.2 案例2

密碼比如是這樣的:'; drop table user;, 這樣的話,那么sql命令就變成了:

select * from user where username = '' and password = ''; drop table user;', 那么這個時候我們會把user表直接刪除了。

1.3 防范

1.3.1 前端

前端表單進行參數格式控制;

1.3.2 后端

  • 我們可以使用預編譯語句(PreparedStatement,這 樣的話即使我們使用sql語句偽造成參數,到了服務端的時候,這個偽造sql語句的參數也只是簡單的字符,并不能起到攻擊的作用。
  • 使用正則表達式過濾傳入的參數

注意: 永遠也不要把未經檢查的用戶輸入的值直接傳給數據庫

  • java中的驗證字符串是否包含sql的判斷
  1. package cn.javanode.thread; 
  2.  
  3. import java.util.regex.Pattern; 
  4.  
  5. /** 
  6.  * @author xgt(小光頭) 
  7.  * @version 1.0 
  8.  * @date 2021-1-8 11:48 
  9.  */ 
  10. public class CheckSqlDemo { 
  11.  
  12.     /**正則表達式**/ 
  13.     private static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" 
  14.             + "(\\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)"
  15.  
  16.  
  17.     private static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE); 
  18.  
  19.     private static boolean isValid(String str) { 
  20.         if (sqlPattern.matcher(str).find()) 
  21.         { 
  22.             System.out.println("未能通過過濾器:str=" + str); 
  23.             return false
  24.         } 
  25.         return true
  26.     } 
  27.  
  28.     public static void main(String[] args) { 
  29.         System.out.println(isValid("tongji_user_add")); 
  30.     } 
  31.  

 補充

PreparedStatement是如何防止SQL注入的?

1. 拼接參數(sql注入)

  1. Connection connection = DriverManager.getConnection(DB_URL, USER, PASS); 
  2.         PreparedStatement preparedStatement = connection.prepareStatement(sql);         
  3.         String param = "'test' or 1=1"
  4.         String sql = "select file from file where name = " + param; // 拼接SQL參數 
  5.         ResultSet resultSet = preparedStatement.executeQuery(); 
  6.         System.out.println(resultSet.next()); 

 輸出結果為 true ,DB中執(zhí)行的SQL為

  1. -- 永真條件1=1成為了查詢條件的一部分,可以返回所有數據,造成了SQL注入問題 
  2. select file from file where name = 'test' or 1=1 

 2. setString (防注入) 

  1. Connection connection = DriverManager.getConnection(DB_URL, USER, PASS); 
  2.         PreparedStatement preparedStatement = connection.prepareStatement(sql);     
  3.         preparedStatement.setString(1,account);//設置參數 
  4.         preparedStatement.setString(2,password); 
  5.         ResultSet resultSet = preparedStatement.executeQuery();//執(zhí)行查詢sql,獲取結果集 

 輸出結果為 false ,DB中執(zhí)行的SQL為 

  1. select file from file where name = '\'test\' or 1=1' 

我們可以看到輸出的 SQL是把整個參數用引號包起來,并把參數中的引號作為轉義字符,從而避免了參數也作為條件的一部分

3. 源碼分析

結論 

  • preparedStatement.setString 會判斷當前參數的符號是否需要轉義,是的話加的轉義符
  • 如果不需要,則直接加上引號

  1. //完整代碼 
  2. public void setString(int parameterIndex, String x) throws SQLException { 
  3.        synchronized (checkClosed().getConnectionMutex()) { 
  4.            // if the passed string is nullthen set this column to null 
  5.            if (x == null) { 
  6.                setNull(parameterIndex, Types.CHAR); 
  7.            } else { 
  8.                checkClosed(); 
  9.  
  10.                int stringLength = x.length(); 
  11.  
  12.                if (this.connection.isNoBackslashEscapesSet()) { 
  13.                    // Scan for any nasty chars 
  14.                    // 判斷是否需要轉義 
  15.                    boolean needsHexEscape = isEscapeNeededForString(x, stringLength); 
  16.  
  17.                    if (!needsHexEscape) { 
  18.                        byte[] parameterAsBytes = null
  19.  
  20.                        StringBuilder quotedString = new StringBuilder(x.length() + 2); 
  21.                        quotedString.append('\''); 
  22.                        quotedString.append(x); 
  23.                        quotedString.append('\''); 
  24.  
  25.                        if (!this.isLoadDataQuery) { 
  26.                            parameterAsBytes = StringUtils.getBytes(quotedString.toString(), this.charConverter, this.charEncoding, 
  27.                                    this.connection.getServerCharset(), this.connection.parserKnowsUnicode(), getExceptionInterceptor()); 
  28.                        } else { 
  29.                            // Send with platform character encoding 
  30.                            parameterAsBytes = StringUtils.getBytes(quotedString.toString()); 
  31.                        } 
  32.  
  33.                        setInternal(parameterIndex, parameterAsBytes); 
  34.                    } else { 
  35.                        byte[] parameterAsBytes = null
  36.  
  37.                        if (!this.isLoadDataQuery) { 
  38.                            parameterAsBytes = StringUtils.getBytes(x, this.charConverter, this.charEncoding, this.connection.getServerCharset(), 
  39.                                    this.connection.parserKnowsUnicode(), getExceptionInterceptor()); 
  40.                        } else { 
  41.                            // Send with platform character encoding 
  42.                            parameterAsBytes = StringUtils.getBytes(x); 
  43.                        } 
  44.  
  45.                        setBytes(parameterIndex, parameterAsBytes); 
  46.                    } 
  47.  
  48.                    return
  49.                } 

 【編輯推薦】

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2011-10-19 10:47:56

2010-04-26 16:31:09

Oracle SQL

2024-08-26 15:31:55

2009-09-23 10:43:22

2012-11-08 17:02:58

2016-09-06 13:40:20

2009-09-17 12:49:31

2010-09-14 16:28:52

2019-01-15 09:24:07

2012-11-14 17:18:58

2010-06-30 17:56:06

2019-09-17 10:06:46

數據庫程序員網絡安全

2010-12-20 16:04:30

2014-10-08 10:01:06

2011-07-12 10:38:10

2013-01-10 18:00:09

2020-08-30 14:34:42

Java語言安全編碼web安全

2013-10-02 17:56:55

蘇寧易購SA權限SQL注入

2020-02-17 09:14:16

云計算云遷移公共云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区在线播放 | 亚洲精品久久久一区二区三区 | 国产精品高潮呻吟久久aⅴ码 | www.日日操| 精品免费国产一区二区三区四区 | 一本久久a久久精品亚洲 | 国产小视频在线 | a级毛片毛片免费观看久潮喷 | 国产精品视频一区二区三 | 交专区videossex农村 | www.99re | 久久久成人免费一区二区 | 亚洲欧美一区二区三区国产精品 | 国产精品久久久久久久久久久久冷 | 欧美日韩国产在线观看 | 亚洲天堂成人在线视频 | 亚洲精品视频二区 | 亚洲 欧美 日韩在线 | 伊人激情网 | 在线观看毛片网站 | 亚洲 欧美 综合 | 极品一区 | 性福视频在线观看 | 不卡在线视频 | 亚洲色在线视频 | 日韩欧美成人一区二区三区 | 一区二区三区久久久 | 日批免费观看 | 一区二区三区在线免费观看 | 视频一区二区在线观看 | 天堂一区二区三区四区 | av一级毛片 | 国产一区二区三区四区区 | 久久成人国产 | 午夜精品一区二区三区在线 | 久久亚洲精品久久国产一区二区 | 又黄又爽的网站 | 日操夜操 | 在线成人免费视频 | 国产一区不卡 | 亚洲欧美中文字幕 |