【问题标题】:Cleaning the String in java在java中清理字符串
【发布时间】:2011-07-11 11:51:44
【问题描述】:

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

【问题讨论】:

  • 如果您使用 ORM 层(这在 Java 中很常见),甚至只是带有命名或枚举参数的语句,那么 SQL 参数的转义将自动为您完成。只要您不手动将字符串连接在一起来构建查询,就应该是安全的。

标签: java string


【解决方案1】:

在 Java 中,您通常不会手动执行此操作。

您将使用PreparedStatement 并通过显式setString()setObject() 方法将任何参数传递给您的SQL 语句。

JDBC 驱动程序将通过这种方式处理它(通过进行必要的转义或通过将 SQL 语句与参数分开发送,具体取决于 DB)。

例如,您的代码可能如下所示(使用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】:

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

    就像你应该在 PHP 中一样:http://php.net/manual/en/pdo.prepared-statements.php

    当我说只有白痴才会使用 mysql_real_escape_string 来支持带有占位符的准备好的语句时,我的意思是没有冒犯。

    【讨论】:

      【解决方案3】:

      您应该使用PreparedStatement 并使用setString 函数设置$input 的值。

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

      【讨论】:

        【解决方案4】:

        简短的回答,不,除了“干净”的非常具体的定义。现在您必须使用特定于语言的解决方案——对于 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                 := [+\-]                                         ;
        

        我们可以构建如下状态机:

        将事件序列(start、start_object、start_key、字符'x'...)转换为将字符编码到缓冲区的指令。

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

        如果可行,它将很容易融入通用编程语言,自动安全地以 SQL、HTML 等语言编写内容的机制。通过调整语言定义以允许 execute_query 找到execute_query("SELECT * FROM Table WHERE ID=$ID") 中程序员指定内容和注入内容之间的界限,并使用这些界限自动转义注入的内容,我们可以使该成语按程序员的意图工作。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2015-04-13
            • 2021-02-16
            • 1970-01-01
            • 1970-01-01
            • 2011-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-27
            相关资源
            最近更新 更多