Я находил ошибку в 'склепе PHP ()'?

Я думаю, что, возможно, нашел ошибку в PHP's crypt() функция в соответствии с Windows.

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

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

Установка

Я использую установку Windows Server с 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 перечисляет этот bugfix:

Исправленная ошибка № 51059 (склеп отказывает, когда недопустимая соль [так] даны).

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

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

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

Однако мой аргумент в пользу 'он - отказ PHP':

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

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

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

13
задан Community 13 April 2017 в 12:13
поделиться

3 ответа

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

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

Между прочим, это касается не Windows, а потокового SAPI (например, Windows Apache 2.2).

4
ответ дан 2 December 2019 в 01:49
поделиться

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

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

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

1
ответ дан 2 December 2019 в 01:49
поделиться

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

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

Ошибка № 51666 - Использование crypt () приводит к зависанию или сбою Apache.

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

2
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: