我想我在这里失去了理智......我的网站遇到了一个问题,它随机停止接受登录。我现在已经能够追踪到 crypt() 的行为非常奇怪。
在我的数据库中,我有用户密码的加密版本 - 所以假设是 Og12345678。
当用户登录时,他们输入密码,我从数据库中读取盐,然后加密他们输入的内容并进行比较 - 通常这效果很好。
所以我正在做 crypt($enteredPassword, $saltFromDb) - 在这种情况下,盐当然是 Og。通常对于给定的用户密码加密工作正常。
当出现问题时(当出现问题时,这是一个永久性的更改,直到我重新启动 Apache)我发现 crypt 开始为具有相同盐的相同输入返回不同的答案。
然而,它是一致的,即一旦系统出错,密码就会返回错误的答案,但它总是返回same错误的答案。重复刷新页面会显示相同的输出。同样的盐也出现在新的错误的地穴结果中,所以并不是说盐在某个地方丢失了。
如果我随后重新启动 Apache 并重新运行脚本而不做任何更改,那么 crypt 的结果就会恢复到应有的样子。
我很欣赏它不是最新的 PHP (5.2.8),但会重视对此的任何看法,包括是否是在更高版本中修复的已知错误(升级 PHP 并不是一件愉快的任务,因为许多网站仍然使用不幸的怪癖,每次升级都需要重新测试) - 如果这是一个已知的已修复错误,那么显然我会尽快将其全部升级,除此之外,将地穴外包到外部可能会更容易,因为我只在一个中使用它我的网站的常见位置。
任何意见表示赞赏。
马特·佩德尔斯登
---更新:2011年3月11日
更正之前给出的有关操作系统的评论...
- 操作系统是 Windows Server 2008 SP1 64 位。抱歉,我应该仔细检查一下,而不是假设我记得!机器是 Dell 2950 8gb Ram、Xeon 处理器。
我开始沿着 Krtek 的建议思考 - 当系统变得不稳定时,如果我生成新的 crypt() (即一个非常简单的示例,我将变量设置为字符串,对其进行加密,然后与地穴进行比较) - 一切都很好。当我重新启动服务器时,一切又回到了之前的计算。所以我绝对倾向于更改用于计算 crypt() 结果的算法...有什么想法可能会导致这种情况发生吗?我打印了 CRYPT_STD_DES 等的值,它们在重新启动之间不会改变。
有人知道什么可能导致这种情况发生吗?
不管是什么,昨天似乎一天之内发生了两次,最奇怪的是。
感谢迄今为止的回答。
---更新:2011年3月16日
只是想提供另一个更新。
这种情况仍在发生,仍然没有进一步了解原因。
如果将来有人遇到这种情况,我认为我的解决方案将是进行一些令人讨厌的 hack,将所有 crypt() 执行推送到外部 C# 应用程序,而不必依赖 PHP 来完成它们。某处出了问题,此时我能看到的唯一解决方案是将其完全从方程中删除。
当然如果是的话still发生了,知道这也会很有趣! :)
谢谢大家。