На производственных серверах вывод ошибок, безусловно, будет отключен как рутина. Тем не менее, я чувствую нервозность, когда вижу подобные сообщения об ошибках даже на моем экране разработчика:
stat(): stat failed for ftp://user:[email protected]:21/dir-de-nada
Это в контексте класса, который я написал вокруг ftp://
поток. Конечно, PHP не может отфильтровать пароли из любого произвольного места. Но в этом случае (как в случае с обёртками URL-адресов и так далее) наличие пароля является стандартным и очевидным.
Я уже ловлю ошибки. Однако я подумал, не нужно ли мне самому разобраться с этим, просто чтобы быть в безопасности во всех контекстах, или если есть способ, которым у меня может быть PHP, чтобы сделать это автоматически и глобально. (Это вопрос здесь.) Я думаю, нет, но нет никакого вреда в том, чтобы бросать здесь зонд.
Что касается того, что меня беспокоит, это только на моем экране разработчика. Однако отчеты об ошибках также будут полезны менеджерам сайтов и т. Д., Которым может не понадобиться знать пароль FTP. Врезка пароля FTP в журнал ошибок не представляет особой проблемы, но для отчетов, сохраняемых в базе данных и т. Д., Я действительно не хочу, чтобы такая информация распространялась где-либо, когда-либо, по очевидным причинам. Профилактические указатели, пожалуйста?
И если кому-то захочется внести соответствующие заметки о том, чтобы PHP не вымывал пароли и т. Д. Конфиденциальную информацию в любом контексте, это тоже приветствуется. Помимо «ничего не выводить никуда».
Редактировать: В ожидании лучших параметров обработчик сообщений и ошибок теперь выполняет следующее:
$msg = preg_replace('#((ftp|http)://)([^@]+?)@#', '$1*:*@', $msg);
Если вы работаете с потоками SSH2, добавьте регулярное выражение для ssh2\.(shell|exec|sftp|scp)
в случае заинтересованности. И для хорошей меры, если вы используете трассировки стека, которые показывают аргументы, их также следует дезинфицировать.
Edit2: Об общей заметке об опыте работы с PHP-оберткой потока FTP.
create_stream_context
/ $param['notification']
) регистрирует в основном пустые / неполные данные вместо полных ответов от FTP-сервера.stream_context_create
ресурс. Предположим, что контексты потока FTP хороши для одноразовых базовых транзакций, но серьезное «нет» для попыток сделать что-то большее за один раз, похоже на незрелый альт. установка для работы с файлами. Следующий…
Нет.
Я думаю, что есть аргумент для настройки имени пользователя и пароля в контекст потока, но это не вариант.
Вы можете предотвратить возникновение этого с помощью API, который не использует URI (FTP или Curl), но это означает более подробный код.
Отключение отчетов об ошибках в производственных системах, безусловно, является обязательным требованием. Но включение собственного обработчика ошибок (как в dev / test, так и в производстве — с функциональностью, зависящей от среды) дает дополнительный уровень защиты.
Попытка вмешательства в выходной поток для управления содержимым сообщений об ошибках не является началом. Но это, безусловно, хорошая идея в вашем обработчике ошибок. Почему вы жестко программируете схемы в своем регулярном выражении?
#(([a-zA-Z]+)://)([^@]+?)@#
Других решений пока нет …