Карта символов не работает во время передачи по FTP
Я недавно перенес веб-сервер со старым магазином PHP, который работает немного хитро: позвольте мне сначала объяснить. Если вы хотите опубликовать это на thedailywtf или codinghorror, милости просим.
Владелец магазина запускает exe на своей машине, чтобы обновить продукты. Программа генерирует (из базы данных MDB Access) свои собственные файлы PHP и, наконец, загружает их на целевой сервер вместе со специальным updatedb.php
и db.sql
файл (который доступен публично из wwwroot
). Затем исполняемый файл вызывает POST
в updatedb.sql
с параметром безопасности, который запрещает иностранным пользователям запускать PHP-скрипт (я не буду объяснять, какой публичный текстовый файл содержит секретный код в первой строке).
Что тогда делает PHP? Просто очистите БД и заново вставьте все данные, даже если на реальной странице магазина не загружаются их данные из MySQL, но каждый сгенерированный файл PHP содержит статическое описание и ссылки на изображения. updatedb.php
загружает данные из db.sql
файл и запускает каждую строку в новом соединении SQL.
Различия в конфигурации
Старый и новый сервер оба работают Apache 2
а также vsftpd
, Я обнаружил, что локаль отличается между двумя: старое использование ISO-8859-15
charmap и новый сервер UTF-8
, vsftpd
конфигурация идентична
Проблема с кодировкой
Я обнаружил, что большинство не-ASCII символов (например, €
уро, °
и акцентированные буквы àèéìòù
) облажался, чтобы они не запускались в операторах SQL (и вы можете догадаться, что экранирование не выполняется, и я могу это подтвердить!)
Вопрос
Так как клиент не хочет портить свой магазин, заставляя меня добавить несколько специальных директив конфигурации PHP для своего хоста, как я могу исправить кодировку символов для файлов, передаваемых по FTP?
Я думал о конфигурации в vsftpd.conf
( источник)
# Enable character convertion. Supported UTF-8 (Russian chars) = UTF8,
# Win-1251 = WIN1251 or 1251, Koi8-r = KOI8R or 878, IBM 866 = DOS or 866.
convert_charset_enable=1
# Define charset local
local_charset=UTF8
# Define default charset on remote host
remote_charset=ISO-8859-15
Но принудительно устанавливать удаленную кодировку на iso-8859-15 не очень хорошо. К счастью, это единственный клиент, который использует FTP-переводы из Windows XP.
[Обновление] Я только что обнаружил, что мой старый вопросный знак евро испортился во время передачи по FTP из- за аналогичной проблемы. В этом случае это были строки SQL, вырезанные из знака €. Теперь это запросы выполняются с запутанным знаком €.