繁体   English   中英

清洁 java 中的字符串

[英]Cleaning the String in java

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

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

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

This way the JDBC driver will handle it (either by doing the necessary escaping or by sending the SQL statement separately form the arguments, depending on the 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();

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

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

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

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

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

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

更长的答案是,最近有关于自动字符串清理器的工作,它弄清楚如何将纯文本内容安全且正确地合并到其他语言的内容中。

HTML 在模板语言中存在自动上下文自动转义符,例如SoyGojQuery 、 cTemplates 、 clearsilver 的变体以及希望很快的其他语言。

正在进行关于推广这一点的研究,以便可以轻松地将其扩展到其他语言。 我正在研究的一个想法是采用带注释的语法来描述像 SQL 这样的目标语言,并找出 escaping 需要为可以填充用户数据的漏洞做什么。

给定如下文法,其中包括显示数据结构如何映射到语言中的子字符串的注释:

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                 := [+\-]                                         ;

我们可以构建一个 state 机器,如下所示:

在此处输入图像描述

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM