Last active
January 18, 2019 05:04
-
-
Save bsakhanov/8e4bb413d0f0a029e907f5b90b0170a0 to your computer and use it in GitHub Desktop.
Загрузка файлов с кириллическими именами в Joomla
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Проблема поддержки русских букв в joomla возникает при использовании галереи, когда разрешаем пользователям добавлять файлы. | |
Есть решение в базе знаний joomla с отключением функции JFile::makeSafe($file), которая считает русские буквы чем-то некорректным и с изменением кодировки в win-1251. Данное решение может отличаться для разных версии используемых галерей, я уже молчу, что необходимо предусмотреть перекодирование имени файла для отображения его пользователю в кодировку сайта. Преимущество только одно: по ftp вы увидите файлы русскими буквами и Вы сможете закачивать файлы с русскими названиями по ftp. Но, как показала практика, совсем не просто тогда заставить вэбсервер показывать эти файлы. Потом инструкция есть только для phocagallery. | |
Я предлагаю более простое решение, и, на мой взгляд более, верное, да и заработает сразу для всех. | |
Обычно сайт уже работает в кодировке UTF-8 и я рекомендую использовать только эту кодировку, потому как только с ней почти не будет проблем. | |
Ищем файлик "/libraries/joomla/filesystem/file.php" а в нем | |
КОД: ВЫДЕЛИТЬ ВСЁ | |
public static function makeSafe($file) | |
{ | |
$regex = array('#(\.){2,}#', '#[^A-Za-z\.\_\- ]#', '#^\.#'); | |
return preg_replace($regex, '', $file); | |
} | |
Та самая функция, проверку которой и не проходят наши русскоязычные файлы. В ней мы и должны разрешить русские буквы. Для это пересохраним данный файл в кодировку "UTF-8 (без BOM)" (название используется в редакторе notepad++) и заменим функцию на следующую: | |
КОД: ВЫДЕЛИТЬ ВСЁ | |
public static function makeSafe($file) | |
{ | |
$regex = array('#(\.){2,}#', '#[^A-Za-z0-9а-яА-ЯёЁ\.\_\- ]#u', '#^\.#'); | |
return preg_replace($regex, '', $file); | |
} | |
Обновим файлик и у нас все работает! | |
Что произошло? | |
Если Ваш сайт уже работает в UTF-8, то и имя файла уже приходит в этой кодировке. Apache и nginx также понимают в русском написании только UTF-8. И только сервисы FTP понимают win-1251. Но пользователи-то работают с файлами через вэб интерфейс, а именно для них мы и стараемся. Функция preg_replace также не очень-то дружит с русскими буквами, поэтому установлен модификатор u для понимания, что это UTF-8 и дополнительно добавлена буква "ё" в обоих регистрах. | |
Что теперь будет делать эта функция? А ничего! Она просто не будет менять название файла и русские буквы будут считаться допустимыми. Т.е. если злоумышленник захочет через данный путь протолкнуть "инъекцию", то ее забанит "makeSafe", а если файл просто имеет русское название, то все хорошо! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment