我想我在这里丢失了我的弹珠......我的网站上有一个问题,它随机停止接受登录.我现在能够将它跟踪到crypt()表现得非常奇怪.
在我的数据库中,我已经获得了用户密码的加密版本 - 所以让我们说Og12345678.
当用户登录时,他们输入他们的密码,我从数据库中读取盐然后加密他们输入的内容并进行比较 - 通常这种方法非常有效.
所以我正在做crypt($ enteredPassword,$ saltFromDb) - 在这种情况下,盐当然是Og.通常对于给定用户,密码crypt工作正常.
当出现问题时(并且当他们重新启动Apache时,他们这样做是永久性的更改)我发现crypt开始为相同的输入使用相同的盐返回一个不同的答案.
然而,它是一致的,即一旦系统出错,crypt将返回错误的答案,但它始终返回相同的错误答案.重复刷新页面显示相同的输出.同样的盐在新的不正确的隐藏结果中也是明显的,所以并不是盐在某处丢失了.
如果我然后重新启动Apache并重新运行脚本而没有任何更改,那么来自crypt的结果将返回到应该如何.
我很欣赏它不是最新的PHP(5.2.8),但会重视任何观点,包括它是否是在更高版本中修复的已知错误(升级PHP并不是一个快乐的任务,其中许多网站仍然使用不幸的怪癖,每次升级都需要重新测试 - 如果它是一个已知的固定bug,那么很明显我会尽快升级它,除此之外,将外部资源外包可能更容易,因为我只在一个地方使用它我网站的常见地方.
任何输入赞赏.
马特佩德莱斯登
---更新:2011年3月11日
以前给出的关于操作系统的评论的更正... - 操作系统是Windows Server 2008 SP1 64位.道歉我应该仔细检查,而不是假设我记得!该机是戴尔2950 8gb Ram,Xeon处理器.
我开始考虑Krtek所建议的 - 当系统变得不稳定时,如果我生成新的crypt()(即一个非常简单的例子,我将变量设置为字符串,加密它然后与地穴进行比较) - 一切都很棒.当我重新启动服务器时,它再次回到之前的计算中.所以我肯定倾向于改变用于计算crypt()结果的算法 ...对可能导致这种情况发生的原因的任何想法?我打印出CRYPT_STD_DES等的值,它们在重新启动之间不会改变.
任何人都有可能导致这种情况发生的线索?
无论它在昨天的某一天似乎发生了两次,最奇怪的是.
谢谢你到目前为止的答案.
---更新:2011年3月16日
只是想提供另一个更新.
这仍然在发生,仍然没有进一步了解原因.
如果将来有人遇到这种情况,我认为我的解决方案将是做一些讨厌的黑客将所有crypt()执行推送到外部C#应用程序并且不再依赖PHP来执行它们.某处出现问题,此时我能看到的唯一解决办法是将其从等式中完全删除.
当然,如果它仍然发生,那也将是有趣的!:)
谢谢大家.
这可能是 Suhosin PHP 安全补丁影响了您的 crypt() 函数。它改变了很多加密/随机方法,可能是问题的原因。
检查 phpinfo() 并查看“suhosin”是否在页面上的任何位置。如果存在,请考虑在 php 配置中禁用它的某些功能。
| 归档时间: |
|
| 查看次数: |
2972 次 |
| 最近记录: |