是否有与PHP的mysql_real_escape_string()等价的Java?PHP的mysql等价物mysql_real_escape_string()
这是为了在将它们传递给Statement.execute()之前转义SQL注入尝试。
我知道我可以使用PreparedStatement来代替,但我们假设这些是一次性语句,所以准备它们将导致lower performance。我已经将代码改为使用PreparedStatement,但考虑到现有代码的结构,escape()函数会使代码更改变得更简单,以便于检查和维护;我更喜欢容易维护代码,除非有额外复杂性的令人信服的理由。 PreparedStatements也由数据库以不同方式处理,因此这可能会使我们发现我们以前没有遇到过的数据库中的错误,在发布到生产之前需要进行更多测试。
Apache StringEscapeUtils escapeSQL()只能转义单引号。
后记: 我继承的环境中有许多微妙之处,我故意避免在我的问题中。
两点考虑:
1)预处理语句是不是万能的,不提供对SQL注入100%的保护。一些数据库驱动程序使用不安全的字符串连接实例化参数化查询,而不是将查询预编译为二进制形式。另外,如果你的SQL依赖于存储过程,你需要确保存储过程本身不会以不安全的方式构建查询。
2)最准备好的语句实现将语句绑定到语句实例化的数据库连接上。如果您正在使用数据库连接池,则需要注意
仅使用准备好的语句引用与其准备的连接。一些池化机制确实透明地实现了这一点。否则,您可以汇总准备好的语句,或者(最简单但更多的开销)为每个查询创建一个新的准备好的语句。
您喜欢易维护的代码,但你宁愿使用手动串逃逸,而不是PrearedStatement? – skaffman 2009-06-19 15:11:46
考虑到现有的代码(我没有写),是的,它会更容易维护。 – 2009-06-19 15:16:57
较低的性能可能比安全风险更具吸引力。安全处罚可能太高。在应用程序初始化代码中准备你的语句,并且惩罚可能是不明显的(当然,取决于应用程序)。 – Cheekysoft 2009-06-22 16:33:56