如何在SQL查询中转义特殊字符?

6

是否有一个Java库可以转义将要插入SQL查询的字符串中的特殊字符。

我一直在编写代码来转义各种东西,但我发现总会遇到一些新问题。因此,一个可以处理所有或大多数可能性的库会非常方便。

编辑:我正在使用MySQL(如果这有任何区别)。


2
不要。停止。使用参数。真的。唯一需要进行转义的情况是在非常有限的动态SQL构建情况下,即使在这种情况下,通常也只涉及结构(例如列/表)元素,而不是数据本身。抱歉大声喊叫。试图根除使用字符串构建(因此需要转义)用于SQL的思维方式 :-) - user166390
3个回答

7

好的... jdbc。将字符串作为参数传递,不要将它们附加到查询字符串中。


3
+1 但是...这应该至少扩展到包括参考/示例。 - user166390
可能是一个新手问题,但我找不到除了executeUpdate或executeQuery以外带有输入参数的替代方法。它们在哪里? - narengi
@narengi:它需要一个由Connection.prepareStatement返回的PreparedStatement,你可以使用setInt、setString等方法传递参数... - Maurice Perry
1
我建议使用spring-jdbc中附带的NamedParamaterJdbcTemplate(不需要使用spring框架)。 - Kimball Robinson

1

2
危险。这不是安全的注入方式。这种方法并不总是有效。问题在于区域设置对于在MySQL中“安全”转义字符串非常重要。这就是为什么PHP引入了mysql_real_escape_string,即使已经有了mysql_escape_string。前者尝试通过考虑区域设置来“修复”这种方法(但它仍然不总是有效)。我不会因为这是你自己的答案而将其投票否决 - 尽管它应该是原始帖子的补充 - 但这不是一个好方法。 - user166390
有关“危险”,请参见:使用MySQL和PHP防止SQL注入攻击并注意:“mysql_escape_string忽略字符集,这可能会为高级黑客留下一些漏洞。”如果某个救生衣在特定情况下会失效,请考虑在商店选择另一个救生衣。这可能非常重要。 - user166390
实际上,StringEscapeUtils 中的方法甚至不能像 mysql_escape_string 一样有效。例如,如果数据包含换行符,它将立即失败。还有其他需要转义但被忽略的“基本”字符。 - user166390

0

我知道这是一个长时间的线程,但是使用commons-lang库有一个名为escapeSql(String)的方法。此外,使用预处理语句可以自动转义有问题的SQL字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接