有没有Java相当于PHP的mysql_real_escape_string()?
这是在将它们传递给Statement.execute()之前,先转义SQL注入尝试.
我知道我可以使用PreparedStatement,但是我们假设这些是一个镜头的语句,所以准备它们将导致lower performance.我已经改变了使用PreparedStatement的代码,但是给定了现有代码的结构,escape()函数将使代码更改更容易审查和维护;我更喜欢容易地维护代码,除非有一个引人注目的理由是额外的复杂性.此外,PreparedStatements也由数据库处理不同,所以这可能会使我们发现我们以前没有遇到的数据库中的错误,在发布到生产之前需要更多的测试.
后记:
在我继承的环境中有很多微妙之处,我故意在我的问题上回避.
两点要考虑:
1)准备的语句不是灵丹妙药,不能提供100%的针对SQL注入的保护.一些数据库驱动程序使用不安全的字符串连接实例化参数化查询,而不是将查询预编译为二进制形式.另外,如果您的SQL依赖于存储过程,则需要确保存储过程本身不会以不安全的方式构建查询.
2)最准备的语句实现将语句绑定到实例化语句的数据库连接.如果您正在使用数据库连接池,则需要小心
仅使用准备好的语句参考,只能使用它准备的连接.一些汇集机制确实实现了这一点.否则,您可以对准备好的语句进行汇总,或者(最简单但更多的开销)为每个查询创建一个新的准备语句.