我只是在浏览一些代码并确保所有用户输入都通过 mysql_real_escape_string() 运行以防止 sql 注入。对于通过 PHP 的 md5() 函数运行的密码输入,还需要 mysql_real_escape_string(0 吗?看起来编码过程将摆脱潜在的注入攻击。
2 回答
MD5不足以保证密码安全——MD5 是一种旧算法,很容易被破解;如果您使用 MD5 来散列密码,那么您可能根本不使用任何东西。当前的最佳实践建议是使用 bcrypt 算法。
mysql_real_escape_string()
连同其他mysql_xxx()
功能现在已弃用。它们被认为是过时且不安全的,并且已经有一段时间不推荐使用了。即将发布的 PHP v5.5 将正式弃用它们,但即使您不打算升级到 5.5,您也应该尝试停止使用它们。请参阅为什么我不应该在 PHP 中使用 mysql_* 函数?有关这方面的更多信息。
正如我所说,MD5 并不安全,人们为自己编写的大多数解决方案也不安全。散列密码的最佳解决方案是使用优质库为您完成工作。PHP 5.5 将包括一组专门编写的密码处理函数,这将使整个事情更容易保持安全。该库还有一个版本已被向后移植以在 PHP 5.3 或 5.4 中工作。您可以从此处下载此反向移植版本:https ://github.com/ircmaxell/password_compat
目前,这可能代表了 PHP 中可用的密码存储的唯一最佳解决方案。我强烈建议您使用它。
实际上,是也不是。
仅当您将第二个参数设置为to --时才需要使用,这会产生 RAW md5 散列。mysql_real_escape_string()
md5()
true
否则,从类似的东西返回的唯一数据md5($password)
将是与此正则表达式匹配的字符串哈希/[a-z0-9]{32}/i
——不需要转义。
这些人解释了他们为什么以及如何利用原始 md5 哈希: