是否有任何函数或库可用于清理用户输入。例如,如果用户输入名为baily's
的文本,则应在发送到mysql查询之前转义'
。同样,我应该能够过滤空字符和\n、\t、\r等。就像在PHP中我们有mysql_real_escape_string($input)
,在Java中有没有类似的东西?
在Java中,通常不需要手动执行此操作。
相反,您将使用PreparedStatement
并通过显式的setString()
或setObject()
方法传递任何参数到SQL语句中。
这样JDBC驱动程序将处理它(根据DB的不同,可能通过执行必要的转义或将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();
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 := [+\-] ;
execute_query
找到程序员指定内容和注入内容之间的边界,在execute_query("SELECT * FROM Table WHERE ID=$ID")
中自动转义注入的内容,我们可以使该习惯用语按照程序员的意图正常运行。setString
函数设置 $input
的值。PreparedStatement
的原因是每个数据库可能需要转义不同的内容。这种复杂性被隐藏在由数据库供应商提供的 PreparedStatement
的具体实现中。你使用的转义符号取决于你想要在哪个系统中使用该字符串。如果你使用MySQL,你需要进行不同的转义,而如果你想在JavaScript代码中使用该字符串,则需要进行其他的转义。
因此,为了回答你的问题,我们需要知道你想如何转义你的字符串。很有可能在将字符串用于数据库上下文之前,你并不需要对其进行转义。例如,如果你使用prepared queries,则不需要转义你的值。
JDBC - 如何使用SQL查询转义用户提供的参数
- jmj