在java中清理String

时间:2011-07-11 11:51:45

标签: java string

是否有任何可用于清理用户输入的函数或库。例如,如果用户输入名为baily's的文本,那么我应该在将'发送到mysql查询之前将其转义。类似地,我应该能够过滤空字符和\ n,\ t,\ r \ n等。就像在PHP中我们mysql_real_escape_string($input)有什么用Java来做这个吗?

5 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

为此使用带有占位符的预准备语句。见http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html

就像你应该用PHP:http://php.net/manual/en/pdo.prepared-statements.php

当我说只有白痴会使用mysql_real_escape_string支持有占位符的预备陈述时,我的意思是没有冒犯。

答案 2 :(得分:2)

您应该使用PreparedStatement并使用$input功能设置setString的值。

使用PreparedStatement的原因是每个数据库可能需要转义不同的东西。这种复杂性隐藏在数据库供应商提供的PreparedStatement的具体实现中。

答案 3 :(得分:2)

简短的回答,不,除了非常具体的“清洁”定义。现在你必须使用特定于语言的解决方案 - 对于SQL,只需使用预准备语句。

更长的答案,最近有关自动消毒杀菌剂的研究工作,以确定如何安全地合并纯文本内容&正确地使用其他语言的内容。

模板语言中的HTML存在自动上下文自动转发器,例如SoyGojQuery的变体,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',...)转换为将字符编码到缓冲区的指令。

从该状态机我们还可以生成通用的指令跟踪,用于为编码器生成有效的代码,并希望上下文分析算法能够确定应用哪些编码器。

如果这样做,它将很容易融入通用编程语言,自动和&amp ;;安全地用SQL,HTML等语言编写内容。通过调整语言定义,允许execute_query找到程序员指定内容和execute_query("SELECT * FROM Table WHERE ID=$ID")中注入内容之间的界限,并使用它们自动转义注入内容,我们可以使这个成语正如程序员所希望的那样工作。

答案 4 :(得分:1)

您使用的转义特定于您要使用该字符串的系统。如果您使用MySQL,则必须执行不同的转义,而不是在一段Javascript中使用该字符串。

所以要回答你的问题,我们需要知道你想如何逃避你的字符串。在数据库上下文中使用它之前,您无需转义字符串。例如,如果您使用prepared queries,则无需转义值。