【问题标题】:How to escape special characters used in SQL query?如何转义 SQL 查询中使用的特殊字符?
【发布时间】:2011-09-25 16:40:10
【问题描述】:

是否有用于从要插入 SQL 查询的字符串中转义特殊字符的 Java 库。

我一直在编写代码来逃避各种事情,但我一直在发现一些新问题让我很头疼。因此,一个能够处理所有或大部分可能性的库将非常方便。

编辑:我正在使用 MySQL(如果这有什么不同的话)。

【问题讨论】:

  • 没有。停止。使用参数。真的。唯一需要进行转义的情况是在非常有限的动态 SQL 构建情况下——即使这样,它通常也只是 结构(例如列/表)元素而不是 data 本身。对不起喊了。试图消除对 SQL 使用字符串构建(并因此转义)的心态 :-)

标签: java sql escaping


【解决方案1】:

更多的研究指出我这一点:

http://devwar.blogspot.com/2010/06/how-to-escape-special-characters-in.html

哪个建议使用apache.commons.lang.StringEscapeUtils,我试试这个

【讨论】:

  • 危险。这不是注射安全的。 这并不总是有效的。问题是 locale 对于“安全”地转义 MySQL 中的字符串很重要。这就是为什么 PHP 在已经有 mysql_escape_string 的情况下引入 mysql_real_escape_string 的原因。前者试图通过考虑语言环境来“修复”该方法(它仍然不总是有效。)我不会投反对票,因为这是你自己的答案——尽管它应该是对原帖的补充——但它不是一个好方法
  • 对于“危险”,请参阅:Preventing SQL Injection Attacks with MySQL and PHP 并注意:“mysql_escape_string 忽略该字符集,这可能会给老练的黑客留下一些漏洞[n] 。”如果给定的救生衣将在某些情况下失效,请考虑在商店中选择不同的救生衣。这可能很重要。
  • 实际上,StringEscapeUtils 中的方法甚至不如mysql_escape_string 有效。例如,如果数据包含换行符,它将立即失败。还有其他需要转义的“基本”字符被遗漏了。
【解决方案2】:

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

【讨论】:

  • +1 但是...这确实应该扩展为至少包含参考/示例..
  • 可能是一个菜鸟问题,但我看不到将参数作为输入的 executeUpdate 或 executeQuery 的替代方法。他们在哪里?
  • @narengi:它需要 Connection.prepareStatement 返回的 PreparedStatement,您可以使用 setInt、setString 等传递参数...
  • 我推荐spring-jdbc自带的NamedParamaterJdbcTemplate(不需要使用spring框架)。
【解决方案3】:

我知道这是一个很长时间的线程,但是使用 commonslang 库有一个名为 escapeSql(String) 的方法。同样使用准备好的语句会自动转义有问题的 SQL 字符。

【讨论】:

    最近更新 更多