Нашел ли я ошибку в PHP `crypt ()`? - PullRequest
13 голосов
/ 23 апреля 2010

Я думаю, что мог найти ошибку в функции PHP crypt() под Windows.

Однако : я понимаю, что это, вероятно, моя вина .PHP используется миллионами и работает тысячами;мой код используется десятками и работает над мной.(Этот аргумент лучше всего объяснил в Coding Horror .)

Поэтому я прошу помощи: покажи мне свою ошибку. Я пытался ее найтив течение нескольких дней безуспешно.

Настройка

Я использую установку Windows-сервера с Apache 2.2.14 (Win32) и PHP 5.3.2.Моя коробка разработки работает под управлением Windows XP Professional;«рабочий» сервер (это настройка интрасети) работает под управлением Windows Storage Server 2003. Проблема возникает в обоих случаях.

Я не вижу ничего в php.ini, связанного с crypt(), но с радостью отвечувопросы о моем конфиге.

Проблема

Иногда в моем PHP-приложении иногда зависают несколько скриптов: страница находится в ожидании localhost и никогда не заканчивается.Каждый из этих сценариев использует crypt для хеширования пароля пользователя перед его сохранением в базе данных или, в случае страницы входа, для хеширования введенного пароля перед сравнением его с версией, хранящейся в базе данных.

Поскольку страница входа в систему является самой простой, я сосредоточился на ней для тестирования.Я неоднократно входил в систему и обнаружил, что он может зависнуть, возможно, 4 раза из 10.

В качестве эксперимента я изменил страницу входа, чтобы использовать простой текстовый пароль, и изменил свой пароль в базе данных на обычный текст.версия.Страница перестала зависать.

Я видел, что в последней версии PHP есть это исправление:

Исправлена ​​ошибка # 51059 (крипта вылетает, когда заданы недопустимые соли).

Итак, я создал очень простой тестовый скрипт, используя следующую соль, приведенную в официальном примере :

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

Эта страница тоже будет зависать, если я перезагрузить его, как сумасшедший.Я только вижу он зависает в Chrome, но независимо от браузера, эффект на Apache одинаков.

Эффект на Apache

Когда эти страницы зависают, Apache страница состояния сервера (которую я объяснил здесь относительно другой проблемы) увеличивает количество обрабатываемых запросов и уменьшает число неработающих работников.Почти все обрабатываемые запросы имеют статус «Отправка ответа», хотя иногда на мгновение они показывают либо «Запрос на чтение», либо «Keepalive (чтение)».

В конце концов, 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 по этому поводу.Аргумент против этого заключается в том, что, как указано выше, ошибки почти всегда являются моей ошибкой.

Тем не менее, мой аргумент в пользу «это ошибка PHP»:

  1. Я использую Windows, в то время как большинство серверов используют Linux (я не могу выбрать это), поэтому больше шансов, что я нашел крайний случай
  2. Недавно была ошибка сcrypt(), так что, возможно, у него все еще есть проблемы
  3. Я сделал простейший тестовый пример, который могу, и у меня все еще есть проблема

Может кто-нибудь повторить это? Можете ли вы подсказать, где я ошибся?Должен ли я сообщать об ошибке в конце концов?

Заранее благодарим за любую помощь, которую вы можете оказать.

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

Ошибки 51059 (только при передаче неверных входных данных) или 50947 (не тот же код, в 5.3 есть новые алгоритмы и функции, реализованные в php на всех платформах) не связаны с этой проблемой.

Однако http://bugs.php.net/bug.php?id=51424 есть. Я уже разместил там частичное исправление, но оно устраняет большинство возможных блокировок, но этого действительно недостаточно. Полное исправление будет представлено в следующей версии 5.3.

Кстати, речь идет не о Windows, а о многопоточном SAPI (например, Windows Apache 2.2).

2 голосов
/ 26 апреля 2010

Этот вопрос был просмотрен 128 раз и проголосовали 9 раз. Единственный ответ, который я получил, говорит, что это ошибка, и указывает на один в базе данных ошибок PHP. Я не думаю, что он точно такой же, но, похоже, он подтверждает мой диагноз.

Поэтому, не долго думая, я подал отчет об ошибке:

Ошибка # 51666 - Использование crypt () приводит к зависанию или аварийному завершению работы Apache

Спасибо всем, кто смотрел на это со мной - даже если вы не ответили, просто знание того, что другие обсуждали это со мной, и не сказал мне, что я сумасшедший, было полезно.

1 голос
/ 23 апреля 2010

Да. Это известная ошибка,

http://bugs.php.net/bug.php?id=50947

Вы можете смоделировать результат crypt (), используя mcrypt. Если вы можете изменить свой хэш пароля, вы должны действительно использовать hash_hmac (), который является более безопасным, и у нас нет проблем с ним на Apache. Однако в Windows нет опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...