是否有任何可用于清理用户输入的函数或库。例如,如果用户输入名为baily's
的文本,那么我应该在将'
发送到mysql查询之前将其转义。类似地,我应该能够过滤空字符和\ n,\ t,\ r \ n等。就像在PHP中我们mysql_real_escape_string($input)
有什么用Java来做这个吗?
答案 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存在自动上下文自动转发器,例如Soy,Go,jQuery的变体,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',...)转换为将字符编码到缓冲区的指令。
从该状态机我们还可以生成通用的指令跟踪,用于为编码器生成有效的代码,并希望上下文分析算法能够确定应用哪些编码器。
如果这样做,它将很容易融入通用编程语言,自动和&amp ;;安全地用SQL,HTML等语言编写内容。通过调整语言定义,允许execute_query
找到程序员指定内容和execute_query("SELECT * FROM Table WHERE ID=$ID")
中注入内容之间的界限,并使用它们自动转义注入内容,我们可以使这个成语正如程序员所希望的那样工作。
答案 4 :(得分:1)
您使用的转义特定于您要使用该字符串的系统。如果您使用MySQL,则必须执行不同的转义,而不是在一段Javascript中使用该字符串。
所以要回答你的问题,我们需要知道你想如何逃避你的字符串。在数据库上下文中使用它之前,您无需转义字符串。例如,如果您使用prepared queries,则无需转义值。