Предупреждения ftp_nlist() и ftp_pwd() в WordPress

3 мая 2020 г., 19:52:59
Просмотры: 16.3K
Голосов: 7

Не уверен, когда именно начали появляться эти предупреждения. Мне передали существующий сайт для хостинга, и я применил следующие рекомендации:

  • Обновил WordPress — с версии 5.3 до 5.4.0 (текущая версия WP)
  • Обновил все плагины — список большой, поэтому не буду его приводить здесь
  • Изменил права доступа и владельца файлов — всё принадлежит моему пользователю (не Apache), и только папка wp-content доступна для записи Apache (с некоторыми ограничениями внутри) → Руководство по усилению безопасности WordPress

Примечание: пользователь и группа Apache используются как Apache, так и PHP-FPM. Сервер (VM) используется только для этого сайта, поэтому мне не нужно решать проблемы безопасности, связанные с разделением процессов.

После этих изменений начали появляться следующие предупреждения PHP (да, я сделал всё одновременно! Извините за это):

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

Эти предупреждения появляются в лог-файле PHP-FPM при каждом вызове сервера. Если установить define( 'WP_DEBUG', true );, их можно увидеть на каждой странице.

Шаги по решению

Я могу устранить эти предупреждения одним из следующих способов:

Ни один из этих вариантов не является желаемым решением. Первый ломает сайт, а второй создаёт проблему безопасности.

Ошибка WordPress?

Я также нашёл WordPress issue 48689, где описаны те же ошибки, но связанные с другими плагинами. Однако решение (if (!defined('FS_METHOD')) define('FS_METHOD', 'direct');) в моём случае не работает. Остальные варианты, такие как скрытие предупреждений, не кажутся хорошей идеей.

1
Комментарии

теперь, когда WordPress обновляется автоматически, все ещё имеет смысл блокировать файлы для вашего пользователя и от пользователя www-data?

wruckie wruckie
18 мар. 2022 г. 20:31:58
Все ответы на вопрос 1
3
20

Ведь это уже было в вопросе!

Контекст

Оба плагина связаны с темой моего сайта на WordPress (uplift). Я не могу понять, что именно он делает и где, но когда он обнаруживает, что владелец файлов — не его пользователь (apache), он меняет метод доступа на FTP.

Такое поведение кажется мне нелогичным, потому что даже если я сделаю 775 user:apache (псевдокод), это не сработает (он проверяет владельца, а не права доступа). Я мог бы сделать 575 apache:user, но в этом случае apache сможет выполнять CHMOD, так что это бессмысленно.

Кроме того, это происходит вне wp-content. И это не задокументировано ни плагинами, ни темой, что, на мой взгляд, является проблемой безопасности. 0 результатов по запросам "owner" и "permission" в документации.

Решение

Просто добавьте define('FS_METHOD', 'direct');.

Но с небольшой оговоркой! Это нужно добавить перед require_once( ABSPATH . 'wp-settings.php' );. Почему? Опять же, понятия не имею. Однако это требование для многих конфигураций, как видно из документации по редактированию wp-config.php.

Предостережения

Как указано в этом ответе, использование FS_METHOD может представлять угрозу безопасности на shared-хостинге. В моём случае это не актуально, поэтому моё исследование закончилось здесь.

Неясные моменты

Пожалуйста, не стесняйтесь ответить на следующие вопросы (в комментариях или отдельным ответом, я приму ответ или дополню свой соответствующим образом):

  1. Что делает тема uplift? Зачем ей проверять владельца файлов?
  2. Почему настройка FS_METHOD должна загружаться до страницы wp-settings.php?
  3. Какое решение подойдёт для shared-хостинга?
3 мая 2020 г. 19:52:59
Комментарии

Работает именно так, как описано выше. Спасибо!

flangofas flangofas
1 дек. 2020 г. 22:32:06

Огромное спасибо за эту статью! Я мучился целую неделю из-за ошибок, похожих на описанные вами, которые мешали обновлению и настройке плагина на моем сайте. Я много раз читал о добавлении "define('FS_METHOD', 'direct');" в конфигурационный файл WordPress для работы на сервере Synology (в моем случае хостинг), но еще не встречал информации о том, что эта строка должна быть перед "require_once( ABSPATH . 'wp-settings.php' );". В моем случае она стояла сразу после, и когда я переместил ее на строку выше - внезапно все заработало! Просто замечательно! Еще раз спасибо.

Gab Gab
25 июл. 2022 г. 22:45:31

Спасибо, друг! Ты спас меня от множества нервов! Эта проблема появилась после смены хостинга.

BenVida BenVida
25 апр. 2024 г. 07:59:38