Skip to content

Instantly share code, notes, and snippets.

@bsakhanov
Last active January 18, 2019 05:04
Show Gist options
  • Save bsakhanov/8e4bb413d0f0a029e907f5b90b0170a0 to your computer and use it in GitHub Desktop.
Save bsakhanov/8e4bb413d0f0a029e907f5b90b0170a0 to your computer and use it in GitHub Desktop.
Загрузка файлов с кириллическими именами в Joomla
Проблема поддержки русских букв в 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