PHP 5.3 и поддержка old passwords в MySQL
Очень любопытно — PHP наконец-то начал насаживать довольно старые стандарты — но почему-то от них не могут отказаться миллионы разработчиков.
После обновления PHP и либы mysqlnd один из production-серверов вскрякнул:
Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:554) in ...
Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in ...
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in ...
Ларчик просто открывается — собственно, все и написано в ошибке. Старый хеш имеет длину в 16 символов, новые — в 41. До сих пор даже в самых последних версиях MySQL не могут по каким-то причинам отказаться от старых паролей и таскают в конфиге этот allow_old_passwords = 1.
Ну, надо идти в ногу со временем.
SELECT `user` FROM `mysql`.`user` WHERE LENGTH(`Password`) = 16;
Ну и
UPDATE `mysql`.`user` SET `Password` = PASSWORD('старый пароль') WHERE `user` = 'юзер со старым хешом';
Удивительно только как проникает-то туда! Подозреваю что это все злой phpMyAdmin с его автоматическими созданиями юзеров