Я думаю, что, возможно, нашел ошибку в 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 может отказать. Когда это делает, отчет о катастрофическом отказе 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':
crypt()
, таким образом, возможно, это все еще имеет проблемыКто-либо может копировать это? Можно ли предложить, где я пошел не так, как надо? Действительно ли я должен зарегистрировать ошибку, в конце концов?
Заранее спасибо за любую справку можно дать.
Ошибки 51059 (только о передаче неверных входных данных) или 50947 (не тот же код, в 5.3 есть новые алгоритмы и функции, реализованные в php на всех платформах) не связаны с этим. проблема.
Однако http://bugs.php.net/bug.php?id=51424 есть. Я уже разместил там частичный патч, но он устраняет большинство возможных блокировок, но этого действительно недостаточно. Полное исправление будет представлено в следующем выпуске 5.3.
Между прочим, это касается не Windows, а потокового SAPI (например, Windows Apache 2.2).
Да. Это известная ошибка,
http://bugs.php.net/bug.php?id=50947
Вы можете смоделировать результат crypt () с помощью mcrypt. Если вы можете изменить хэш пароля, вам действительно следует использовать hash_hmac (), который более безопасен, и у нас нет проблем с ним на Apache. Однако в Windows нет опыта.
Этот вопрос был просмотрен 128 раз и получил 9 голосов. Единственный ответ, который я получил, говорит, что это ошибка, и указывает на ошибку в базе данных ошибок PHP. Я не думаю, что это точно такой же, но, похоже, мой диагноз подтверждается.
Поэтому, немного колеблясь, я отправил отчет об ошибке:
Ошибка № 51666 - Использование crypt () приводит к зависанию или сбою Apache.
Спасибо всем, кто смотрел на это вместе со мной - даже если вы этого не сделали. Я не отвечаю, просто зная, что другие обсуждают это со мной, и не говорить мне, что я сумасшедший, было полезно.