RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Обработка имен файлов

Joomla может содержать большое кол-во файлов. Взаимодействие с ними: автоматическое создание имен, чтение, запись - обычное дело для некоторых компонентов Joomla. Хорошим примером в этом случае можно назвать «Медиа менеджер». При неправильном именовании файлов и обращении к ним существует опасность непредвиденных ошибок на сервере и даже дыр в безопасности. Особо нужно быть осторожным, если пользователю самому дано право менять имена файлов на сервере, либо загружить свои. Подробную информацию о уязвимости можно прочитать на сайте cwe.mitre.org.

Статический класс JFile, который предоставляет нам встроенная библиотека из набора Joomla. Подключить библиотеку можно с помощью следующей строки.

jimport('joomla.filesystem.file');

Обезопасить имя файла очень просто - для этого есть универсальный метод

// делаем имя файла безопасным
$safeFilename = JFile::makeSafe($unsafeFilename);

Как работает makeSafe() ? Очень просто! Он проверяет наличие в строке спецсимволов и последовательностей, Если находит что-либо подозрительное, то просто удаляет их из исходного файла.

Ниже идет перечень правил и соответствующих примеров, по которым можно примерно понять суть работы класса.

  • Имя не должно начинаться с точки
  • Удаляются точки стоящие рядом
  • Все символы кроме латиницы, точки, цифр, подчеркивания, пробела минуса будут удалены
Оригинальное
Безопасное
Комментарий
.htaccess htaccess Убирает точку в начале имени
some%20file.html some20file.html Символ (%) процент
../../traversed.file traversed.file Удаление разделителя (/) и двойных точек
spaced out.file spaced out.file Все нормально, изменений не произходило
dotty...to..the.dot dottytothe.dot Повторение символа точки (.)

 

Часто бывает необходимо проверить расширение файла, чтобы отказаться в загрузке подозрительных (например ".php"). В этом нам поможет метод getExt():


switch (JFile::getExt($filename)) {
    case 'jpeg':
    case 'jpg':
        echo 'File is a JPEG';
        break;
    case 'gif':
        echo 'File is a GIF';
        break;
    default:
        echo 'File is not a JPEG or a GIF';
}

При необходимости можно очень просто удалить расширения в имени файла

$filenameWithoutExtension = JFile::stripExt($filename);

Таким образом можно для картинок в формате JPEG, у которых расширение может встретиться как ".jpeg", так и ".jpg", сделать небольшой сценарий, чтобы все картинки подобного формата всегда хранились с одним и тем же расширением.

$filename = JFile::stripExt($filename) . '.jpeg';

Так же полезным может оказаться метод для проверки существования файла. Например так

if (JFile::exists($filename)) {
    echo "<img src=\"$filename\" alt=\"image\">";
} else {
    echo JText::_("No Image File");
}

Смотрите также:
Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.