我在PHP的"crypt()"中找到了一个错误吗?

Nat*_*ong 13 php encryption

我想我可能crypt()在Windows下发现了PHP的功能错误.

但是:我认识到这可能是我的错.数以百万计的PHP使用PHP并且成千上万; 我的代码被数十使用并由我工作.(这个论点最好用Coding Horror来解释.)

所以我在寻求帮助:告诉我我的错.我一直试图找几天,没有运气.

设置

我正在使用Apache 2.2.14(Win32)和PHP 5.3.2的Windows服务器安装.我的开发盒运行Windows XP Professional; 'production'服务器(这是一个Intranet设置)运行Windows Storage Server 2003.两者都会出现问题.

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

问题

我的PHP应用程序中的几个脚本偶尔会挂起:页面位于'等待本地主机'并且永远不会完成.这些脚本中的每一个都用于crypt在将用户密码存储在数据库中之前对其进行哈希处理,或者在登录页面的情况下,在将输入的密码与存储在数据库中的版本进行比较之前对其进行哈希处理.

由于登录页面最简单,我专注于测试.我反复登录,发现它可能会挂起10次中的4次.

作为实验,我更改了登录页面以使用纯文本密码并将数据库中的密码更改为纯文本版本.页面停止了.

我看到PHP的最新版本列出了这个错误修正:

修正了错误#51059(当给出无效盐时,地址崩溃).

所以我使用官方示例中给出的相同的盐创建了一个非常简单的测试脚本,如下所示:

$foo = crypt('rasmuslerdorf','r1');
echo $foo;
Run Code Online (Sandbox Code Playgroud)

如果我像疯了一样重装它,这个页面也会挂起.我只看到它挂在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
Run Code Online (Sandbox Code Playgroud)

这是我的错吗?

我很想在此向PHP提交错误报告.如上所述,反对它的论点是错误几乎总是我的错.

但是,我支持'这是PHP的错误'的论点是:

  1. 我使用的是Windows,而大多数服务器都使用Linux(我不会选择这个),所以我发现边缘情况的可能性更大
  2. 最近有一个bug crypt(),所以它可能还有问题
  3. 我做了最简单的测试用例,我仍然遇到了问题

有人可以复制这个吗?你能说出我哪里出错吗?毕竟我应该提交错误吗?

在此先感谢您提供的任何帮助.

Pie*_*rre 4

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

然而http://bugs.php.net/bug.php?id=51424是。我已经在那里发布了部分补丁,但它解决了大多数可能的锁定,但确实还不够。完整的修复将出现在下一个 5.3 版本中。

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