Java 是否有相当于 PHP 的 mysql_real_escape_string() ?
这是为了在将 SQL 注入尝试传递给 Statement.execute() 之前逃避它们。
我知道我可以使用PreparedStatement代替,但我们假设这些是一次性语句,所以准备它们将导致性能较低。我已经更改了代码以使用PreparedStatement,但考虑到现有代码的结构方式,escape() 函数将使代码更改更易于审查和维护;我更喜欢易于维护的代码,除非有令人信服的理由导致额外的复杂性。此外,数据库对PreparedStatement的处理方式不同,因此这可能会让我们面临数据库中以前没有遇到过的错误,在发布到生产环境之前需要进行更多测试。
Apache StringEscapeUtils escapeSQL()只转义单引号。
后记:
我所继承的环境中有很多微妙之处,我在问题中刻意回避了。
需要考虑两点:
1)准备好的语句不是万能的,不能提供100%的针对SQL注入的保护。某些数据库驱动程序使用不安全的字符串连接来实例化参数化查询,而不是将查询预编译为二进制形式。此外,如果您的 SQL 依赖于存储过程,则需要确保存储过程本身不会以不安全的方式构建查询。
2) 大多数准备好的语句实现将语句绑定到实例化该语句的数据库连接。如果您使用数据库连接池,则需要小心
仅将准备好的语句引用与准备好的连接一起使用。一些池机制确实透明地实现了这一点。否则,您也可以合并准备好的语句,或者(最简单但开销更大)为每个查询创建一个新的准备好的语句。
据我所知,没有“标准”方法可以做到这一点。
尽管您目前存在担忧,但我强烈建议您使用准备好的陈述。对性能的影响可以忽略不计——我们也有类似的情况,每秒有数千条语句——其中大多数也是一次性的。
您获得的安全性应该比您尚未看到的性能问题更重要。在我看来,这是一个明确的“不要过早优化”的情况。
无论如何,如果您后来确实发现遇到了性能问题,请通过仔细分析来确保准备好的语句确实是原因,然后寻找替代方案。在那之前,你应该省去试图正确逃脱的麻烦。
这甚至更重要,因为我推断您正在开发某种面向公众的网站 - 内部应用程序很少获得足够的流量来关心性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)