是否有任何函數或庫可用於清理用戶輸入。例如,如果用戶輸入一個名爲baily's
的文本,那麼我應該在將它發送到mysql查詢之前轉義'
。同樣,我應該能夠過濾空字符和\ n,\ t,\ r等等。就像在PHP中一樣,我們有mysql_real_escape_string($input)
Java中有這樣的東西嗎?在java中清理字符串
回答
在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();
您應該使用PreparedStatement並使用setString
函數將值設置爲$input
。
使用PreparedStatement
的原因是每個數據庫可能需要轉義不同的東西。數據庫供應商提供的PreparedStatement
的具體實現中隱藏了這種複雜性。
您使用佔位符爲這個準備的語句。見http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html
就像你在PHP應該:http://php.net/manual/en/pdo.prepared-statements.php
我的意思是沒有罪的時候我說,只有白癡會贊成與佔位符的預處理語句使用mysql_real_escape_string
。
您使用的轉義特定於您要使用該字符串的系統。如果你使用MySQL,你必須做不同的轉義,如果你想在一段Javascript中使用字符串。
所以要回答你的問題,我們需要知道你想如何逃避你的字符串。在數據庫上下文中使用它之前,您可能不需要轉義該字符串。例如,如果您使用prepared queries,則不需要轉義您的值。
簡短的回答,不,除了非常具體的「乾淨」的定義。現在,您必須使用特定於語言的解決方案 - 對於SQL,只需使用準備好的語句即可。
較長的答案,近來有關自動字符串消毒器的工作已經發現,它將解決如何將純文本內容安全地&正確地合併到其他語言的內容中。
模板語言中存在HTML的自動上下文自動轉義程序,如Soy,Go,jQuery的變體,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 := [+\-] ;
我們可以建立一個狀態機的形式大致如下:
它將事件序列(start,start_object,start_key,字符'x',...)轉換爲將字符編碼到緩衝區的指令。
從該狀態機中,我們還可以生成通用的指令跟蹤信息,以便爲編碼器生成高效的代碼,並希望能夠找出何時應用哪些編碼器的上下文分析算法。
如果這能起作用,它可以很容易地結合到通用編程語言中,自動安排用SQL,HTML等語言安全編寫內容的機制。通過調整語言定義以允許execute_query
找到邊界在程序員指定的內容和注入的內容之間,並使用這些來自動轉義注入的內容,我們可以讓這個習慣用法像程序員的意圖一樣工作。
- 1. 字符串清理在C#中
- 2. 在SQL中清理CSV字符串/ varchar
- 3. XmlSerializer的清理字符串
- 4. 蟒蛇:清理字符串
- 5. 清理查詢字符串
- 6. 高效清理表中的字符串
- 7. 清理的字符串在紅移
- 8. 方法來清理字符串中的Java
- 9. 如何清理字符串中的'$'和'/'(java)
- 10. 清理字符串:單分隔符
- 11. 在Java中處理utf-8字符串
- 12. 字符串的處理在Java中
- 13. 在Python中清理字符串(可能是編碼的字符串)
- 14. 如何清理從字符串stl字符串C++
- 15. 如何徹底清理python中的非法字符字符串?
- 16. PHP清理字符串中的特殊字符
- 17. Java中的中文字符串處理?
- 18. asp.net web api - 清理輸入字符串
- 19. 替代功能來清理字符串
- 20. Spark - Rdd字符串清理/操作
- 21. 字符串空白清理不修剪
- 22. Javascript - 使用str.replace()清理字符串
- 23. SQL命令字符串清理
- 24. 如何從Request.Url清理json字符串
- 25. .htaccess:清理查詢字符串
- 26. Utf8 - 如何清理這些字符串?
- 27. 清理從HTML代碼和重音與java的字符串
- 28. java字符串處理字符串替換在同一位置
- 29. 檢查在java字符串處理
- 30. 添加在java字符串處理
如果您使用ORM層(這在Java中很常見),甚至只是使用帶有命名或枚舉參數的語句,那麼SQL參數的轉義將自動爲您完成。只要你沒有手動連接字符串來建立你的查詢,你應該是安全的。 – aroth
**另請參閱:** ['JDBC - 如何使用sql查詢轉義用戶提供的參數](http://stackoverflow.com/questions/4954002/jdbc-how-to-escape-user-supplied-參數上帶有一個-SQL查詢) –