PHP messaggio di errore mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication

17 giugno 2015

​Per questioni di sicurezza, con l'evoluzione delle versioni, MySQL ha modificato l'hash con cui vengono memorizzate le password delle utenze che possono accedere ai database. Le vecchie password sono memorizzate con un hash di 16 caratteri le nuove di 41. Per verificarlo basta visualizzare il contenuto della tabella user del database mysql.

Se si utilizza una versione di MySQL successiva alla 4.1, ma nel file di configurazione my.cnf è stata impostata la direttiva:
old-passwords=1
allora verrà utilizzato comunque il vecchio schema di memorizzazione.

PHP, versione 5.3 e successive, per la connessione usa di default il driver mysqlnd che adotta il nuovo algoritmo di hash.

Risulta evidente come la combinazione di queste variabili possa portare alla generazione dell'errore sopra riportato.

Se si utilizza PHP 5.3 o superiore ed una versione di MySQL superiore alla 4.1 una soluzione può essere eliminare il flag old-passwords=1 da my.cnf (riavviare MySQL) ed effettuare un upgrade delle password:
mysql> SET PASSWORD FOR 'miouser'@'localhost' = PASSWORD('miapass');
Query OK, 0 rows affected (0.00 sec)
Se però è necessario mantenere la retrocompatibilità, magari perchè ci si connette al database anche da una versione di PHP vecchia, ci si può limitare a memorizzare la password di un prefissato utente con il nuovo algoritmo:
mysql> SET @@session.old_passwords = 0;
Query OK, 0 rows affected (0.00 sec);

mysql> SET PASSWORD FOR 'myuser'@'myhost' = PASSWORD('mypass');

Query OK, 1 rows affected (0.00 sec);