1. 程式人生 > >關於spring 防sql注入,轉義反轉義,入參檢查

關於spring 防sql注入,轉義反轉義,入參檢查

收集下面連結,很好的解決sql注入和入參檢查以及編碼解碼問題,有需要的可以參考學習

阿里的資料連線池

Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

這裡謝謝博主 欣怡

org.apache.commons.lang.StringEscapeUtils

類可以對js sql html xml等程式碼進行轉義!用來處理前端js注入程式碼

SQL特殊字元轉義

  應該說,您即使沒有處理 HTML 或 JavaScript 的特殊字元,也不會帶來災難性的後果,但是如果不在動態構造 SQL 語句時對變數中特殊字元進行處理,將可能導致程式漏洞、資料盜取、資料破壞等嚴重的安全問題。網路中有大量講解 SQL 注入的文章,感興趣的讀者可以搜尋相關的資料深入研究。

  雖然 SQL 注入的後果很嚴重,但是隻要對動態構造的 SQL 語句的變數進行特殊字元轉義處理,就可以避免這一問題的發生了。來看一個存在安全漏洞的經典例子:

SELECT COUNT(userId)
FROM t_user
WHERE userName='”+userName+”' AND password ='”+password+”';

  以上 SQL 語句根據返回的結果數判斷使用者提供的登入資訊是否正確,如果 userName 變數不經過特殊字元轉義處理就直接合併到 SQL 語句中,黑客就可以通過將 userName 設定為 “1' or '1'='1”繞過使用者名稱/密碼的檢查直接進入系統了。

  所以除非必要,一般建議通過 PreparedStatement 引數繫結的方式構造動態 SQL 語句,因為這種方式可以避免 SQL 注入的潛在安全問題。但是往往很難在應用中完全避免通過拼接字串構造動態 SQL 語句的方式。為了防止他人使用特殊 SQL 字元破壞 SQL 的語句結構或植入惡意操作,必須在變數拼接到 SQL 語句之前對其中的特殊字元進行轉義處理。Spring 並沒有提供相應的工具類,您可以通過 jakarta commons lang 通用類包中(spring/lib/jakarta-commons/commons-lang.jar)的 StringEscapeUtils 完成這一工作:

  清單 4. SqlEscapeExample

package com.baobaotao.escape;
import org.apache.commons.lang.StringEscapeUtils;
public class SqlEscapeExample {
  public static void main(String[] args) {
    String userName = ”1' or '1'='1”;
    String password = ”123456”;
    userName = StringEscapeUtils.escapeSql(userName);
    password = StringEscapeUtils.escapeSql(password);
    String sql = ”SELECT COUNT(userId) FROM t_user WHERE userName='”
      + userName + ”' AND password ='” + password + ”'”;
    System.out.println(sql);
  }
}

  事實上,StringEscapeUtils 不但提供了 SQL 特殊字元轉義處理的功能,還提供了 HTML、XML、JavaScript、Java 特殊字元的轉義和還原的方法。如果您不介意引入 jakarta commons lang 類包,我們更推薦您使用 StringEscapeUtils 工具類完成特殊字元轉義處理的工作。

------------------------------

 方法入參檢測工具類

  Web 應用在接受表單提交的資料後都需要對其進行合法性檢查,如果表單資料不合法,請求將被駁回。類似的,當我們在編寫類的方法時,也常常需要對方法入參進行合法性檢查,如果入參不符合要求,方法將通過丟擲異常的方式拒絕後續處理。舉一個例子:有一個根據檔名獲取輸入流的方法:InputStream getData(String file),為了使方法能夠成功執行,必須保證 file 入參不能為 null 或空白字元,否則根本無須進行後繼的處理。這時方法的編寫者通常會在方法體的最前面編寫一段對入參進行檢測的程式碼,如下所示:

public InputStream getData(String file) {
  if (file == null || file.length() == 0|| file.replaceAll(”s”, ””).length() == 0) {
    throw new IllegalArgumentException(”file入參不是有效的檔案地址”);
  }

}

  類似以上檢測方法入參的程式碼是非常常見,但是在每個方法中都使用手工編寫檢測邏輯的方式並不是一個好主意。閱讀 Spring 原始碼,您會發現 Spring 採用一個 org.springframework.util.Assert 通用類完成這一任務。

  Assert 翻譯為中文為“斷言”,使用過 JUnit 的讀者都熟知這個概念,它斷定某一個實際的執行值和預期想一樣,否則就丟擲異常。Spring 對方法入參的檢測借用了這個概念,其提供的 Assert 類擁有眾多按規則對方法入參進行斷言的方法,可以滿足大部分方法入參檢測的要求。這些斷言方法在入參不滿足要求時就會丟擲 IllegalArgumentException。下面,我們來認識一下 Assert 類中的常用斷言方法:


斷言方法     說明 
notNull(Object object)     當 object 不為 null 時丟擲異常,notNull(Object object, String message) 方法允許您通過 message 定製異常資訊。和 notNull() 方法斷言規則相反的方法是 isNull(Object object)/isNull(Object object, String message),它要求入參一定是 null; 
isTrue(boolean expression) / isTrue(boolean expression, String message)     當 expression 不為 true 丟擲異常; 
notEmpty(Collection collection) / notEmpty(Collection collection, String message)     當集合未包含元素時丟擲異常。notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分別對 Map 和 Object[] 型別的入參進行判斷; 
hasLength(String text) / hasLength(String text, String message)     當 text 為 null 或長度為 0 時丟擲異常; 
hasText(String text) / hasText(String text, String message)     text 不能為 null 且必須至少包含一個非空格的字元,否則丟擲異常; 
isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message)     如果 obj 不能被正確造型為 clazz 指定的類將丟擲異常; 
isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)     subType 必須可以按型別匹配於 superType,否則將丟擲異常; 



  使用 Assert 斷言類可以簡化方法入參檢測的程式碼,如 InputStream getData(String file) 在應用 Assert 斷言類後,其程式碼可以簡化為以下的形式:

public InputStream getData(String file){
  Assert.hasText(file,”file入參不是有效的檔案地址”);
  ① 使用 Spring 斷言類進行方法入參檢測

}

  可見使用 Spring 的 Assert 替代自編碼實現的入參檢測邏輯後,方法的簡潔性得到了不少的提高。Assert 不依賴於 Spring 容器,您可以大膽地在自己的應用中使用這個工具類

--------------code--------------

  • import org.apache.commons.lang.StringEscapeUtils;  
  • public class EscapeString {  
  •     public static void main(String[] args) throws Exception {  
  •         String str = "中國";  
  •         System.out.println("用escapeJava方法轉義之後的字串為:"+StringEscapeUtils.escapeJava(str));  
  •         System.out.println("用unescapeJava方法反轉義之後的字串為:"+StringEscapeUtils.unescapeJava(StringEscapeUtils.escapeJava(str)));  
  •         System.out.println("用escapeHtml方法轉義之後的字串為:"+StringEscapeUtils.escapeHtml(str));  
  •         System.out.println("用unescapeHtml方法反轉義之後的字串為:"+StringEscapeUtils.unescapeHtml(StringEscapeUtils.escapeHtml(str)));  
  •         System.out.println("用escapeXml方法轉義之後的字串為:"+StringEscapeUtils.escapeXml(str));  
  •         System.out.println("用unescapeXml方法反轉義之後的字串為:"+StringEscapeUtils.unescapeXml(StringEscapeUtils.escapeXml(str)));  
  •         System.out.println("用escapeJavaScript方法轉義之後的字串為:"+StringEscapeUtils.escapeJavaScript(str));  
  •         System.out.println("用unescapeJavaScript方法反轉義之後的字串為:"+StringEscapeUtils.unescapeJavaScript(StringEscapeUtils.escapeJavaScript(str)));  
  •         /**輸出結果如下: 
  •          用escapeJava方法轉義之後的字串為:/u4E2D/u56FD/u5171/u4EA7/u515A 
  •         用unescapeJava方法反轉義之後的字串為:中國
  •         用escapeHtml方法轉義之後的字串為:中國
  •         用unescapeHtml方法反轉義之後的字串為:中國
  •         用escapeXml方法轉義之後的字串為:中國
  •         用unescapeXml方法反轉義之後的字串為:中國
  •         用escapeJavaScript方法轉義之後的字串為:/u4E2D/u56FD/u5171/u4EA7/u515A 
  •         用unescapeJavaScript方法反轉義之後的字串為:中國*/  
  •     }  
  • }  
轉載地址:http://blog.csdn.net/niuch1029291561/article/details/17377857

相關推薦

關於spring sql注入轉義轉義檢查

收集下面連結,很好的解決sql注入和入參檢查以及編碼解碼問題,有需要的可以參考學習 阿里的資料連線池 Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。 https://github.com/alibaba/druid/wiki/%E

Python 資料庫操作mysqlsql注入引數化

  demo.py(防sql注入): from pymysql import * def main(): find_name = input("請輸入物品名稱:") # 建立Connection連線 conn = connect(host='local

jquery過濾特殊字元'sql注入

出自:  直接上程式碼: <script type="text/javascript" language="javascript"> $(document).ready(function() { //返回 $("#btnBack").click(

PHP PDO預處理方式(PDOStatement物件)實現 增刪改查。sql注入

demo.php(?號式的預處理sql語句,增刪改): <?php //?號式的預處理語句 一共有3種繫結方式 //1.連線資料庫 try{ $pdo = new PDO("mysql:host=localhost;dbname=資料庫名","root

php對前臺提交的表單資料做安全處理(SQL注入和XSS攻擊等)

/** * 防sql注入字串轉義 * @param $content 要轉義內容 * @return array|string */ public static function escapeString($content) { $pa

php用於SQL注入的幾個函式

用於防SQL注入的幾個函式 不要相信使用者的在登陸中輸入的內容,需要對使用者的輸入進行處理 SQL注入: ' or 1=1 #   防止SQL注入的幾個函式:   addslashes($string):用反斜線引用字串中的特殊字元' " \ $u

MySQLSQL注入

1,mysql_real_escape_string()函式已經不安全,可以利用編碼的漏洞來實現輸入任意密碼就能登入伺服器的注入攻擊 2,使用擁有Prepared Statement機制的PDO和MYSQLi來代替mysql_query(注:mysql_query自 PHP 5.5.0 起已

ubuntu上安裝Apache2+ModSecurity及實現SQL注入演示

ubuntu上安裝Apache2+ModSecurity及實現防SQL注入演示 一、Apache2 的安裝 1.1、安裝環境: OS:Ubuntu 16.04.1 LTS Apache: Apache/2.4.18 (Ubuntu) 安裝命令: 更新安裝源:

回頭探索JDBC及PreparedStatementSQL注入原理

概述 JDBC在我們學習J2EE的時候已經接觸到了,但是僅是照搬步驟書寫,其中的PreparedStatement防sql注入原理也是一知半解,然後就想回頭查資料及敲測試程式碼探索一下。再有就是我們在專案中有一些配置項是有時候要變動的,比如資料庫的資料來源,為了在修改配置時不改動編譯的程式碼,我們把要變動的

sql注入方法

一、什麼是sql注入 sql注入是比較常見的網路攻擊方式之一,它不是利用作業系統的bug進行攻擊,而是通過程式設計程式碼的疏漏,通過編寫特定的sql語句,進行資料庫的非法訪問。 二、 sql注入流程 尋找sql注入位置 判斷伺服器型別和後臺資料型別 針對不同的伺服器和資料庫特點

mybatissql注入

MyBatis如何防止SQL注入      SQL注入是一種程式碼注入技術,用於攻擊資料驅動的應用,惡意的SQL語句被插入到執行的實體欄位中(例如,為了轉儲資料庫內容給攻擊者)。[摘自] SQL injection - Wikipedia SQL注入,

C# 使用引數化SQL語句(SQL注入攻擊)

“SQL注入攻擊”問題。我們在程式中存在著大量拼接產生SQL語句的程式碼,這就會導致一個比較大的安全隱患,容易遭受SQL注入攻擊。我們在程式碼中用的SQL語句是: string sqlStr = "select * from [Users] where User

web安全sql注入

所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程式,將(惡意的)SQL命令注入到後臺資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得

JDBC及sql注入攻擊

哪有什麼一夜成名,都是百鍊成鋼 JDBC JDBC(Java DataBase Connectivity,java資料庫連線)又SUN公司開發,是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDB

【php】PDO資料庫sql注入

安全的方式: $pdo = new PDO('mysql:host=localhost;dbname=phptry','username','passwd'); $pdo->query("SET

JAVA WEB中處理SQL注入|XSS跨站指令碼攻擊(咋個辦呢 zgbn)

JAVA WEB中處理防SQL注入|防XSS跨站指令碼 在java web專案中,必然會涉及到從客戶端向服務端提交資料,那麼由於服務端對資料的處理等動作,會因為字串拼接和使用的特殊性,存在一些漏洞被人利用。 這篇文章,主要介紹一下在java web專案中,程

PHP中XSS攻擊和sql注入

SQL注入如何防? TP中的底層已經做了防SQL注入的操作,只要我們操作資料庫時使用TP提供給我們的方法就不會有問題,如新增商品時我們呼叫了add方法。唯一要注意的就是如果我們自己拼SQL執行時就要自己來過濾了。 總結:如果要自己拼SQL語句,一定要自己再過濾一下【add

mybatis like %% 模糊查詢sql 注入

所以解決的思路是:sql中應該跟正常的替換方式相同,ibatis並沒有提供特殊寫法,應該在傳入的引數上下功夫。 也就意味著需要自己來做轉譯。 SQL文: select * from A where A.name like #{key} java端對Key值進行轉譯:    

簡單的ASP.netSQL注入

防sql注入是每個開發人員都要考濾的問題asp.net有個Global.asax檔案,有一個Application_BeginRequest方法(應用啟動獲取)就是當獲取到引數時觸發的事件;這裡就是網站頁面每次提交時都要經過的事件;在這裡做防注入就一下子卡住入口了程式碼如下:

C#SQL注入程式碼的三種方法

對於網站的安全性,是每個網站開發者和運營者最關心的問題。網站一旦出現漏洞,那勢必將造成很大的損失。為了提高網站的安全性,首先網站要防注入,最重要的是伺服器的安全設施要做到位。 下面說下網站防注入的幾點要素。   一:丟棄SQL語句直接拼接,雖然這個寫起來很快