我是否在 PHP 的 `crypt()` 中发现了错误?

2024-03-07

我想我可能发现了 PHP 中的一个错误crypt()Windows 下的功能。

However: 我承认这可能是我的错。 PHP 有数百万人使用,有数千人在使用 PHP;我的代码被数十人使用并由我处理。 (这个说法最好编码恐怖中的解释 http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html.)

所以我请求帮助:让我看看我的错。我这几天一直在努力寻找它,但没有成功。

设置

我使用的是带有 Apache 2.2.14 (Win32) 和 PHP 5.3.2 的 Windows 服务器安装。我的开发盒运行Windows XP Professional; “生产”服务器(这是一个 Intranet 设置)运行 Windows Storage Server 2003。两者都会出现问题。

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

问题

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

由于登录页面是最简单的,所以我重点测试一下。我反复登录,发现大概十次就有四次挂掉。

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

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

修复了错误#51059(当 给出了无效的盐[原文如此])。

所以我创建了一个非常简单的测试脚本,如下所示,使用中给出的相同盐一个官方的例子 http://php.net/manual/en/function.crypt.php:

$foo = crypt('rasmuslerdorf','r1');
echo $foo;

如果我疯狂地重新加载,这个页面也会挂起。我只是see它挂在Chrome中,但无论什么浏览器,在Apache上的效果都是一样的。

对阿帕奇的影响

当这些页面挂起时,Apache 的服务器状态页面 http://httpd.apache.org/docs/2.0/mod/mod_status.html(我解释过here https://serverfault.com/questions/95620/local-apache-on-windows-xp-not-finishing-page-requests/102080#102080,关于不同的问题)增加正在处理的请求数量并减少空闲工作人员的数量。正在处理的请求几乎都有“正在发送回复”的状态,尽管有时它们会暂时显示“正在读取请求”或“保持活动(已读)”。

最终,阿帕奇可能会崩溃。当发生这种情况时,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 提交一份错误报告。如上所述,反对它的论点是错误几乎总是我的错。

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

  1. 我使用的是 Windows,而大多数服务器使用 Linux(我无法选择这个),因此我发现边缘情况的可能性更大
  2. 最近有一个错误crypt(),所以也许仍然有问题
  3. 我已经做了我能做的最简单的测试用例,但仍然有问题

任何人都可以复制这个吗?你能建议我哪里出错了吗?我到底应该提交错误吗?

预先感谢您提供的任何帮助。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我是否在 PHP 的 `crypt()` 中发现了错误? 的相关文章

随机推荐