'mysql_real_escape_string' 足够了吗

信息安全 密码 php sql注入 mysql
2021-08-31 13:30:17

最近在 stackoverflow 上,我看到了许多mysql_*_escape_string已弃用的讨论,而是推荐 PDO。
我一直在这样做的方式是只允许字母和字段,允许密码字段中'name所有字符(但然后散列它),然后使用mysql_real_escape_string转义特殊字符。所以我读到了mysqli但我看到它和 mysql 一样:

转义一串字符。

那么使用mysql_*和不使用mysqli或不使用的安全问题是什么PDO

1个回答

如果mysql_real_escape_string每次将内容注入 SQL 字符串文字时都使用一致,那很好,不存在安全问题。

然而,时间告诉我们的是:

  • 捕捉注入到 SQL 字符串文字中的每一个地方都很难。在现实世界的软件中,有时会遗漏未转义的情况,即使原始编码人员正确理解 SQL 转义也是如此。或者稍后在维护中添加原始注射。或者在编码人员认为字符串中不可能存在特殊字符的情况下省略转义,但后来发生了一些变化并且该假设不再成立。

  • 乱扔您的查询...'.mysql_real_escape_string($value, $db).'...会使它们乏味且难以阅读。

  • 人们仍然不了解与之real相关的编码问题,因此无法以正确的方式设置字符集(mysql_set_charset(),不错SET NAMES)。

我们可以将剩下的时间花在用mysql扩展编写的代码中来解决这些问题,或者只是推动每个人使用参数化查询,它们可以正常工作,而不需要对字符串处理有任何深入的了解。