joomla поддержка русских букв в названиях файлов.

dtvims
Site Admin
Сообщения: 115
Зарегистрирован: Пн авг 02, 2010 2:43 pm

joomla поддержка русских букв в названиях файлов.

Сообщение dtvims » Пт июн 15, 2012 4:52 pm

Проблема поддержки русских букв в 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", а если файл просто имеет русское название, то все хорошо!

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость