Avvisi ftp_nlist() e ftp_pwd() in WordPress
Non sono sicuro di quando sia iniziato questo avviso. Ho preso in carico un sito esistente per gestirne l'hosting e ho applicato le seguenti buone pratiche:
- Aggiornato Wordpress - dalla versione 5.3 alla 5.4.0 (versione attuale di WP)
- Aggiornati tutti i plugin - è una lista lunga quindi non la riporto qui
- Modificato i permessi e il proprietario dei file - tutto di proprietà del mio utente (non Apache) e solo la cartella
wp-content
è scrivibile da Apache (con alcune restrizioni interne) -> Guida per il rafforzamento della sicurezza di WordPress
Come nota, l'utente e il gruppo di Apache sono utilizzati sia da Apache che da PHP-FPM. Utilizziamo il server (VM) solo per questo sito web, quindi non devo affrontare problemi di sicurezza legati alla condivisione dei processi.
Con queste modifiche, ho iniziato a ricevere i seguenti avvisi PHP (Sì, ho fatto tutto allo stesso tempo! Scusate per questo):
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 681
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 681
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_rmdir() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 381
Warning: ftp_nlist() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 402
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 226
Warning: ftp_pwd() expects parameter 1 to be resource, null given in /var/www/html/wp-admin/includes/class-wp-filesystem-ftpext.php on line 681
Questi avvisi compaiono nel file di log di PHP-FPM ad ogni chiamata al server. Se imposto define( 'WP_DEBUG', true );
possono essere visualizzati in ogni pagina.
Passaggi per risolvere
Posso fermare questi avvisi facendo una delle seguenti operazioni:
- Disabilitando i plugin Swift Framework e Redux Framework.
- Impostando la proprietà dei file della cartella WordPress ad Apache.
Nessuna di queste modifiche è la soluzione desiderata. La prima rompe il sito, e la seconda crea un problema di sicurezza.
Bug di WordPress?
Ho anche trovato il problema 48689 di WordPress che descrive gli stessi errori ma associati a plugin diversi. Tuttavia, la soluzione (if (!defined('FS_METHOD')) define('FS_METHOD', 'direct');
) non funziona nel mio caso. Le opzioni rimanenti, come nascondere gli avvisi, non sembrano essere una buona idea.
Dopotutto, era già nella domanda!
Contesto
Entrambi i plugin sono correlati al tema del mio sito WordPress (uplift). Non riesco a capire cosa stia facendo o dove, ma quando rileva che il proprietario dei file non è l'utente in esecuzione (apache), cambia il metodo di accesso in FTP.
Questa azione non mi sembra logica, perché anche se faccio 775 utente:apache
(pseudo-codice), non funziona (sta cercando il proprietario, non se ha i permessi). Potrei fare 575 apache:utente
ma in quel caso, apache può eseguire CHMOD, quindi è inutile.
Inoltre, questo sta accadendo al di fuori di wp-content
. E non è documentato né dai plugin né dal tema, il che per me sembra un problema di sicurezza. 0 risultati per "owner" e "permission" nella documentazione.
Soluzione
Basta aggiungere define('FS_METHOD', 'direct');
.
Con una piccola precauzione! Questo deve essere aggiunto prima di require_once( ABSPATH . 'wp-settings.php' );
. Perché? Ancora, non ne ho idea. Tuttavia, questo è un requisito per diverse configurazioni come puoi vedere nella pagina di documentazione Editing wp-config.php
Attenzioni
Come affermato in questa risposta, l'uso di FS_METHOD
può rappresentare un rischio per la sicurezza in hosting condivisi. Non è il mio caso, quindi la mia indagine si è conclusa qui.
Mancanze
Sentiti libero di rispondere ai seguenti dubbi (nei commenti o con una risposta, accetterò la risposta o completerò la mia di conseguenza):
- Cosa sta facendo il tema uplift? Perché hanno bisogno di verificare il proprietario?
- Perché l'impostazione
FS_METHOD
deve essere caricata prima della paginawp-settings.php
? - Quale sarebbe la soluzione per uno scenario di hosting condiviso?

Grazie mille per questo post! Ho lottato per una settimana a causa di errori simili a quelli che descrivi che impedivano aggiornamenti e configurazione di un plugin sul mio sito. Avevo letto molte volte di aggiungere "define('FS_METHOD', 'direct');" nel file di configurazione di WordPress per farlo funzionare su un server Synology (nel mio caso l'host) Ma non avevo ancora letto che quella riga doveva essere posizionata prima di "require_once( ABSPATH . 'wp-settings.php' );" Nel mio caso era posizionata subito dopo e quando l'ho spostata su una riga sopra, improvvisamente tutto ha iniziato a funzionare! Fantastico! Grazie ancora
