2011-07-11 67 views
9

是否有任何函數或庫可用於清理用戶輸入。例如,如果用戶輸入一個名爲baily's的文本,那麼我應該在將它發送到mysql查詢之前轉義'。同樣,我應該能夠過濾空字符和\ n,\ t,\ r等等。就像在PHP中一樣,我們有mysql_real_escape_string($input) Java中有這樣的東西嗎?在java中清理字符串

+0

如果您使用ORM層(這在Java中很常見),甚至只是使用帶有命名或枚舉參數的語句,那麼SQL參數的轉義將自動爲您完成。只要你沒有手動連接字符串來建立你的查詢,你應該是安全的。 – aroth

+1

**另請參閱:** ['JDBC - 如何使用sql查詢轉義用戶提供的參數](http://stackoverflow.com/questions/4954002/jdbc-how-to-escape-user-supplied-參數上帶有一個-SQL查詢) –

回答

11

在Java中,您通常不會親自做這件事。

取而代之,您將使用PreparedStatement並通過顯式的setString()setObject()方法將任何參數傳遞到您的SQL語句。

通過這種方式,JDBC驅動程序將處理它(通過執行必要的轉義或通過根據數據庫分別發送參數的SQL語句)。

例如,您的代碼可能看起來像(使用prepareStatement()):

Connection c = ...; // get Connection from somehwere 
PreparedStatement stmt = c.prepareStatement("SELECT * FROM BOOKS WHERE TITLE = ?"); 
stmt.setString(1, userInput); 
ResultSet result = stmt.executeQuery(); 
2

您應該使用PreparedStatement並使用setString函數將值設置爲$input

使用PreparedStatement的原因是每個數據庫可能需要轉義不同的東西。數據庫供應商提供的PreparedStatement的具體實現中隱藏了這種複雜性。

1

您使用的轉義特定於您要使用該字符串的系統。如果你使用MySQL,你必須做不同的轉義,如果你想在一段Javascript中使用字符串。

所以要回答你的問題,我們需要知道你想如何逃避你的字符串。在數據庫上下文中使用它之前,您可能不需要轉義該字符串。例如,如果您使用prepared queries,則不需要轉義您的值。

2

簡短的回答,不,除了非常具體的「乾淨」的定義。現在,您必須使用特定於語言的解決方案 - 對於SQL,只需使用準備好的語句即可。

較長的答案,近來有關自動字符串消毒器的工作已經發現,它將解決如何將純文本內容安全地&正確地合併到其他語言的內容中。

模板語言中存在HTML的自動上下文自動轉義程序,如Soy,GojQuery的變體,cTemplates,clearsilver和希望其他人很快。

目前正在研究如何將這一概念化,以便可以很容易地將其擴展到其他語言。我正在處理的一個想法是採用註釋語法來描述像SQL這樣的目標語言,並找出可以用用戶數據填充的漏洞需要完成的轉義。

給出像下面這包括註釋語法,顯示如何將數據映射到子語言中的結構:

JSONValue   := JSONNullLiteral 
         | JSONBooleanLiteral 
         | JSONObject 
         | JSONArray 
         | JSONString 
         | JSONNumber         ; 
JSONObject   := @KeyValueMap ([{] JSONMemberList? [}])  ; 
JSONMemberList  := JSONMember ([,] JSONMemberList)?    ; 
JSONMember   := @Key JSONString [:] @Value JSONValue   ; 
JSONNullLiteral  := @ValueNull "null"        ; 
JSONBooleanLiteral := @ValueFalse "false" | @ValueTrue "true"  ; 
JSONArray   := @List("[" (JSONValue ([,] JSONValue)*)? "]") ; 
JSONString   := @String ([\"] JSONStringCharacters? [\"])  ; 
JSONNumber   := @Number (Sign? (Mantissa Exponent? | Hex)) ; 
JSONStringCharacters := JSONStringCharacter JSONStringCharacters?  ; 
JSONStringCharacter := @Char ([^\"\\\x00-\x1f]) 
         | JSONEscapeSequence       ; 
JSONEscapeSequence := "\\" @Char [/\\\"] 
         | @Char{[\x08]} "\\b" 
         | @Char{[\x0c]} "\\f" 
         | @Char{[\x0a]} "\\n" 
         | @Char{[\x0d]} "\\r" 
         | @Char{[\x09]} "\\t" 
         | @Char ("\\u" @Scalar (hex hex hex hex))  ; 
Mantissa    := (Integer ([.] Fraction?) | [.] Fraction)  ; 
Exponent    := [Ee] Sign? decimal+       ; 
Integer    := [0] | [1-9] [0=9]*       ; 
Fraction    := [0-9]+          ; 
Hex     := [0] [Xx] hex+         ; 
Sign     := [+\-]           ; 

我們可以建立一個狀態機的形式大致如下:

enter image description here

它將事件序列(start,start_object,start_key,字符'x',...)轉換爲將字符編碼到緩衝區的指令。

從該狀態機中,我們還可以生成通用的指令跟蹤信息,以便爲編碼器生成高效的代碼,並希望能夠找出何時應用哪些編碼器的上下文分析算法。

如果這能起作用,它可以很容易地結合到通用編程語言中,自動安排用SQL,HTML等語言安全編寫內容的機制。通過調整語言定義以允許execute_query找到邊界在程序員指定的內容和注入的內容之間,並使用這些來自動轉義注入的內容,我們可以讓這個習慣用法像程序員的意圖一樣工作。