我是否在PHP';是'crypt()`?

我是否在PHP';是'crypt()`?,php,encryption,Php,Encryption,我想我可能在Windows下PHP的crypt()函数中发现了一个bug 然而:我认识到这可能是我的错。PHP被数以百万计的人使用,被成千上万的人使用;我的代码由tens使用,由我处理。(这个论点是最好的。) 所以我请求帮助:告诉我我的错。我已经试着找了几天了,但运气不好 设置 我使用的是Windows服务器安装的Apache 2.2.14(Win32)和PHP5.3.2。我的开发箱运行Windows XP Professional;“生产”服务器(这是一个内部网设置)运行Windows Sto

我想我可能在Windows下PHP的
crypt()
函数中发现了一个bug

然而:我认识到这可能是我的错。PHP被数以百万计的人使用,被成千上万的人使用;我的代码由tens使用,由我处理。(这个论点是最好的。)

所以我请求帮助:告诉我我的错。我已经试着找了几天了,但运气不好

设置 我使用的是Windows服务器安装的Apache 2.2.14(Win32)和PHP5.3.2。我的开发箱运行Windows XP Professional;“生产”服务器(这是一个内部网设置)运行Windows Storage server 2003。这两方面都有问题

我在
php.ini
中没有看到任何与
crypt()
相关的内容,但我很乐意回答有关我的配置的问题

问题 我的PHP应用程序中有几个脚本偶尔会挂起:页面位于“等待本地主机”上,永远不会结束。这些脚本中的每一个都使用
crypt
在将用户密码存储在数据库中之前对其进行哈希运算,或者在登录页面中,在将输入的密码与存储在数据库中的版本进行比较之前对其进行哈希运算

因为登录页面是最简单的,所以我将重点放在它上面进行测试。我反复登录,发现它可能会挂起10次中的4次

作为一个实验,我将登录页面更改为使用纯文本密码,并将数据库中的密码更改为纯文本版本。那页不再挂了

我看到PHP的最新版本列出了以下错误修复:

修复了漏洞51059(当 给出了无效的盐(原文如此)

因此,我创建了一个非常简单的测试脚本,如下所示,使用中给出的相同salt:

如果我疯狂地重新加载,这个页面也会挂起。我只看到它挂在Chrome上,但不管浏览器是什么,对Apache的影响都是一样的

对Apache的影响 当这些页面挂起时,Apache(我针对另一个问题进行了解释)会增加正在处理的请求的数量,并减少空闲工作线程的数量。正在处理的请求几乎都处于“发送回复”状态,尽管有时它们会显示“正在阅读请求”或“正在阅读”

最终,Apache可能会崩溃。如果出现,Windows崩溃报告如下所示:

szAppName: httpd.exe
szAppVer: 2.2.14.0
szModName: php5ts.dll
szModVer: 5.3.1.0 // OK, this report was before I upgraded to PHP 5.3.2, 
                  // but that didn't fix it
offset: 00a2615
是我的错吗? 我很想就此向PHP提交一份bug报告。如上所述,反对它的理由是bug几乎总是我的错。

然而,我支持“这是PHP的错”的论点是:

  • 我使用的是Windows,而大多数服务器使用的是Linux(我不能选择这个),因此我发现边缘案例的可能性更大
  • 最近有一个关于
    crypt()
    的bug,所以它可能仍然存在问题
  • 我已经做了我能做的最简单的测试用例,但我仍然有这个问题
  • 有人能重复一下吗?你能告诉我哪里出错了吗?我到底应该把这个bug归档吗

    提前感谢您提供的任何帮助。

    是的。这是一个已知的错误


    可以使用mcrypt模拟crypt()结果。如果您可以更改密码哈希,那么您应该真正使用hash_hmac(),它更安全,并且在Apache上没有任何问题。不过,在Windows上没有任何体验。

    这个问题现在已被浏览128次,并被投票9次。我收到的唯一答案是这是一个bug,并指向PHP bug数据库中的一个bug。我不认为是完全一样的,但它似乎证实了我的诊断

    因此,我犹豫了一下,提交了一份bug报告:

    感谢所有和我一起看这篇文章的人——即使你没有回复,只是知道其他人在和我一起考虑这篇文章,而不是告诉我我疯了,这是很有帮助的。

    错误51059(仅关于传递无效输入)或50947(不同的代码,5.3在所有平台上都用php实现了新的算法和功能)与此问题无关

    然而,事实并非如此。我已经在那里发布了一个部分补丁,但它解决了大多数可能的锁,但这确实是不够的。下一个5.3版本中将提供完整的修复程序


    顺便说一句,它不是特定于windows的,而是关于线程化SAPI(例如windows apache 2.2)。

    对于这样的简单测试,您可能会发现首先使用PHP的CLI版本更容易。这将帮助您忽略不相关的因素(Apache、浏览器等)。要么crypt函数的行为相同,要么您可以开始缩小导致问题的耦合范围。@Matthew-好主意。我刚刚转到命令行并尝试了
    c:\php\php.exe-f“c:\path\to\testfile.php”
    。我一直按向上箭头并反复执行此操作。它运行正常。不知道为什么不同,我不确定那是同一个错误。这是Solaris上的SIGSEGV,而Nathan的问题是Windows上的挂起。@Matthew-我也这么认为。我决定打开我自己的报告。谢谢令人惊叹的!谢谢,很高兴收到为PHP提供补丁的人的回复。
    szAppName: httpd.exe
    szAppVer: 2.2.14.0
    szModName: php5ts.dll
    szModVer: 5.3.1.0 // OK, this report was before I upgraded to PHP 5.3.2, 
                      // but that didn't fix it
    offset: 00a2615