当前位置: 首页 > 面试题库 >

Java等同于PHP的mysql_real_escape_string()

扈沛
2023-03-14
问题内容

是否有Java等价于PHP的mysql_real_escape_string()?

这是为了避免在将SQL注入尝试传递给Statement.execute()之前进行尝试。

我知道我可以改用PreparedStatement,但让我们假设这些只是一次声明,所以准备它们会导致性能降低。我已经将代码更改为使用PreparedStatement,但是考虑到现有代码的结构方式,escape()函数将使代码更改更易于查看和维护。我更喜欢易于维护的代码,除非有令人信服的理由说明其额外的复杂性。此外,数据库对PreparedStatement的处理方式也有所不同,因此这可能使我们面临以前从未遇到过的数据库错误,因此在发布到生产环境之前需要进行更多测试。

Apache StringEscapeUtils escapeSQL()仅对单引号进行转义。

后记:我继承的环境中有很多微妙之处,是我在问题中特意避免的。

需要考虑两点:

1)预备语句不是万能药,并且不能提供100%防止SQL注入的保护。一些数据库驱动程序使用不安全的字符串连接实例化参数化查询,而不是将查询预编译为二进制形式。另外,如果您的SQL依赖于存储过程,则需要确保存储过程本身不会以不安全的方式构建查询。

2)大多数准备好的语句实现将语句绑定到实例化该语句的数据库连接。如果您正在使用数据库连接池,则需要注意,
仅将预准备的语句引用与预准备的连接一起使用。一些池化机制确实透明地实现了这一点。否则,您也可以合并准备好的语句,或者(最简单但更麻烦的方法)为每个查询创建一个新的准备好的语句。


问题答案:

据我所知,没有“标准”的方式来做到这一点。

尽管您当前担心,但我强烈建议您使用准备好的语句。对性能的影响将是微不足道的-我们有一个类似的情况,每秒有数千条语句-其中大多数也是单发的。

您获得的安全性应比尚未出现的性能问题高得多。我认为这是“不要过早优化”的明确情况。

无论如何,如果您以后真的要发现性能问题,请仔细分析以确保准备好的语句是真正的原因,然后寻找替代方法。到那时为止,您应该省去尝试正确进行转义的麻烦。

当我推断您正在开发某种面向公众的网站时,这一点甚至更为重要-内部应用程序很少会获得足够的流量来关注性能



 类似资料:
  • 问题内容: 如何将PHP变量的值转换为字符串? 我在寻找比连接空字符串更好的东西: 就像Java或.NET中的方法一样。 问题答案: 您可以使用强制转换运算符: PHP手册的“ 字符串”部分提供了有关字符串转换和转换的更多详细信息,包括对布尔值和null的特殊处理。

  • 问题内容: JavaScript中是否有一种方法可以比较一个数组中的值并查看它是否在另一个数组中? 类似于PHP的功能? 问题答案: 不,它没有一个。因此,大多数流行的库在其实用程序包中都附带一个库。查看jQuery的inArray和Prototype的Array.indexOf的示例。 jQuery的实现就像您期望的那样简单: 如果您要处理大量的数组元素,那么上面的技巧就可以很好地解决问题。 编

  • 问题内容: 我已经找到了以下问题,但我想知道是否有一种更快,更脏的方法来估算不依赖外部库的python解释器当前正在使用多少内存。 我来自PHP,过去经常为此目的使用memory_get_usage()和memory_get_peak_usage(),我希望能找到一个等效的对象。 问题答案: 以下代码为Linux和其他系统提供了一个简单的解决方案,我在我的项目中使用了以下代码: 它返回当前和峰值驻

  • 问题内容: 这是执行字符串替换的两种方法: 如何使用Java做与第一种方法类似的操作? 问题答案: 或更短:

  • 问题内容: 实现与Java等效的C ++的首选方法是什么? 问题答案: 尝试使用: 这要求你的编译器启用rtti支持。 编辑:我对这个答案有很好的评论! 每次需要使用dynamic_cast(或instanceof)时,最好问问自己是否必要。通常,这是不良设计的标志。 典型的解决方法是将要检查的类的特殊行为放入基类的虚函数中,或者引入诸如访问者之类的东西,你可以在不更改接口的情况下为子类引入特定行

  • 问题内容: 这个功能有jQuery版本吗? 字符串 strip_tags (字符串$ str [,字符串$ allowable_tags]) 从字符串中剥离所有标签和标签内的内容,但允许标签字符串中定义的标签和内容除外。 喜欢: 从: 问题答案: 要删除 标记,而不 除去 content ,这就是PHP的行为,您可以执行以下操作: