是否有Java等效于PHP的mysql_real_escape_string()函数?
这是为了在将其传递给Statement.execute()之前避免SQL注入尝试。
我知道我可以使用PreparedStatement,但假设这些是一次性语句,因此准备它们将导致较低的性能。我已经更改了代码以使用PreparedStatement,但考虑到现有代码的结构,一个escape()函数将使代码更简单易于审查和维护;除非有强制性的理由需要额外的复杂性,否则我更喜欢易于维护的代码。此外,PreparedStatements被数据库以不同的方式处理,因此这可能会暴露我们以前没有遇到过的数据库错误,在发布到生产之前需要进行更多的测试。
Apache StringEscapeUtils escapeSQL()仅转义单引号。
附言: 我故意避开了我继承的环境中的许多微妙之处。
需要考虑两个要点:
1)准备好的语句并不能完全防止SQL注入。一些数据库驱动程序使用不安全的字符串连接实例化参数化查询,而不是将查询预编译为二进制形式。此外,如果您的SQL依赖存储过程,则需要确保存储过程本身不以不安全的方式构建查询。
2) 大多数预处理语句实现将语句绑定到创建它的数据库连接上。如果您正在使用数据库连接池,则需要小心地确保仅在它被准备的连接上使用预处理语句引用。某些连接池机制可以自动透明地实现这一点。否则,您可以将预处理语句作为池化对象,或者(最简单但开销更大)为每个查询创建一个新的预处理语句。