清理java中的字符串

清理java中的字符串,java,string,Java,String,是否有任何函数或库可用于清理用户输入。例如,如果用户输入一个名为bally's的文本,那么我应该在将其发送到mysql查询之前转义“。同样,我应该能够过滤空字符和\n、\t、\r等。。就像在PHP中一样,我们有mysql\u real\u escape\u string($input)Java中有什么东西可以做到这一点吗 您应该使用setString功能来使用和设置$input的值 使用PreparedStatement的原因是每个数据库可能需要转义不同的内容。这种复杂性隐藏在数据库供应商提供的

是否有任何函数或库可用于清理用户输入。例如,如果用户输入一个名为
bally's
的文本,那么我应该在将其发送到mysql查询之前转义
。同样,我应该能够过滤空字符和\n、\t、\r等。。就像在PHP中一样,我们有
mysql\u real\u escape\u string($input)
Java中有什么东西可以做到这一点吗

您应该使用
setString
功能来使用和设置
$input
的值


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

在Java中,通常不需要手动完成

相反,您将使用,并通过显式或方法将任何参数传递给SQL语句

JDBC驱动程序将以这种方式处理它(根据数据库的不同,通过执行必要的转义或通过从参数中单独发送SQL语句)

例如,您的代码可能如下所示(使用):


为此,可以使用带有占位符的准备语句。看

就像您在PHP中应该做的那样:


当我说只有傻瓜才会使用
mysql\u real\u escape\u string
来支持带有占位符的语句时,我没有冒犯的意思。

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


所以要回答你的问题,我们需要知道你想如何摆脱你的字符串。在数据库上下文中使用字符串之前,可能不需要对其进行转义。例如,如果您使用,您不需要转义您的值。

简短回答,否,除了“clean”的非常具体的定义。现在,您必须使用特定于语言的解决方案——对于SQL,只需使用一条准备好的语句即可

更详细的回答是,最近有一项关于自动字符串清理器的工作,它解决了如何安全、正确地将纯文本内容合并到其他语言的内容中的问题

HTML的自动上下文自动转义器存在于模板语言中,如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_对象、start_键、字符“x”、…)转换为将字符编码到缓冲区的指令

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

如果这能起作用,它将很容易融入到通用编程语言中,以SQL、HTML、,等等。通过对语言定义的调整,允许
execute\u query
execute\u query(“SELECT*FROM Table WHERE ID=$ID”)
中查找程序员指定内容和注入内容之间的边界,并使用这些边界自动转义注入内容,我们可以让这个习惯用法按照程序员的意愿工作。

如果您使用ORM层(这在Java中是常见的做法),甚至只使用带有命名或枚举参数的语句,那么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                 := [+\-]                                         ;