mysql_real_escape_string()还需要md5()吗?

时间:2011-08-03 18:01:33

标签: php md5 sql-injection mysql-real-escape-string

我正在浏览一些代码并确保所有用户输入都是通过mysql_real_escape_string()进行符文以防止sql注入。对于通过PHP的md5()函数运行的密码输入,是mysql_real_escape_string(0仍然需要?看起来编码过程可以摆脱潜在的注入攻击。

2 个答案:

答案 0 :(得分:2)

实际上,是和否。

如果您将mysql_real_escape_string()的第二个参数设置为md5(),则只有 才能使用true RAW md5哈希。

否则,从md5($password)之类的内容返回的唯一数据将是与此正则表达式/[a-z0-9]{32}/i匹配的字符串哈希 - 这不是 需要 逃脱。

这些人解释了为什么以及如何利用原始md5哈希:

http://cvk.posterous.com/sql-injection-with-raw-md5-hashes

答案 1 :(得分:2)

  1. MD5 足以保证密码安全 - MD5是一种容易被黑客攻击的旧算法;如果您使用MD5进行散列密码,您可能根本不使用任何东西。目前的最佳做法建议是使用bcrypt算法。

  2. mysql_real_escape_string()以及其他mysql_xxx()函数现已弃用。它们被认为是过时和不安全的,现在还没有被推荐使用。即将推出的PHP v5.5将正式弃用它们,但即使您不打算升级到5.5,也应该尝试停止使用它们。有关详情,请参阅Why shouldn't I use mysql_* functions in PHP?

  3. 正如我所说,MD5并不安全,也不是人们为自己写的大多数解决方案。散列密码的最佳解决方案是使用高质量的库来为您完成工作。 PHP 5.5将包含一组专门编写的密码处理函数,这将使整个事情更容易保持安全。还有一个版本的这个库已被反向移植到PHP 5.3或5.4中。您可以从此处下载此backport版本:https://github.com/ircmaxell/password_compat

    目前,这可能是PHP中可用的密码存储的最佳解决方案。我强烈建议你使用它。