Какова наилучшая бизнес-практика по проверке имени файла?

StackOverflow https://stackoverflow.com/questions/1870425

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть "дилемма", и мне интересно, какова наилучшая практика ведения бизнеса.

Я использую Uploadify для загрузки изображений.Теперь мне нужно проверить имя файла перед сохранением файла.

Я рассматривал разные решения, но не могу прийти к одному хорошему решению.

Вот мои критерии:

  • Имя файла должно быть полностью в нижнем регистре
  • Имя файла может содержать только символы [a-z0-9_-]
  • Я должен иметь возможность переименовать файл

Как бы вы поступили, если бы имя файла было my.file(name).jpeg ?

Я мог бы разбить имя файла на '.' и сохранить расширение, затем разбить, чтобы снова получить имя файла.Но не уверен, что это лучшее решение.

У меня есть следующие функции, которые немного помогают:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

ОБНОВЛЕНИЕ 1
Я получаю файл через $_FILES .Это дает мне следующие данные:

  • $_FILES["файл"]["имя"] - имя загруженного файла.
  • $_FILES["файл"]["тип"] - тип загруженного файла.
  • $_FILES["файл"]["размер"] - размер в байтах загруженного файла.
  • $_FILES["файл"]["tmp_name"] - имя временной копии файла, хранящейся на сервере
  • $_FILES["файл"]["ошибка"] - код ошибки, возникающий в результате загрузки файла.

ОБНОВЛЕНИЕ 2
Я только что кое-что нашел.Я мог бы использовать получите максимальный размер который вернет массив из 7 элементов.Одним из таких элементов [2] является IMAGETYPE_XXX.

Поэтому я пытаюсь использовать этот код:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

Но это возвращает только число 2...

(Я также пробовал использовать exif_imagetype, но это только Ошибка PHP:Вызов неопределенной функции.)

Это было полезно?

Решение

Проверьте имя файла с помощью регулярного выражения.Используйте информацию о mimetype.Сохраните файл на сервере с именем md5.Храните реальное имя файла в базе данных.

Другие советы

pathinfo() путь () могу предоставить вам имя файла и расширение.Однако я предупреждаю вас, что вы не можете полагаться на тестирование расширения файла путем проверки его имени файла.Для этого вы захотите использовать функцию, которая фактически проверяет двоичное содержимое файла. finfo_file() файл finfo_file() может достичь этого.О, и это никогда не помешает использовать базовое имя() по пути к файлу, указанному пользователем, чтобы предотвратить атаку с обходом пути.

Я предполагаю, что вы проверяете имена файлов для последующего использования в качестве имен загружаемых файлов.

Хотя было бы здорово сохранить имена файлов такими, какие они есть, ради удобства пользователя, с технической точки зрения ваш подход звучит разумно.

Если вас волнует, как выглядят URL-адреса, и в будущем они могут быть ориентированы на международную аудиторию, обязательно либо преобразуйте умляуты в их базовые символы, либо конвертируйте их сами.Немецкий пользователь (Umlauts Ä Ö Ü β) ожидал бы конверсии:

Ä = ae
Ö = oe
Ü = ue

в то время как скандинавы, кажется, чувствуют себя непринужденно с

Ä => a
Ö => o
Ø => o

и так далее.

Затем идут различные символы с ударением "а" и "а"...

Полное удаление этих ссылок приводит к URL-адресам, которые выглядят действительно bd и lok strng в адресе bwsr br.

Это должно сделать все, что вы хотите:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

И, как объяснил Пекка, если вы хотите заменить все подчеркивания в имени файла, вы можете использовать следующую функцию:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

Я не думаю, что вам следует "проверять" имя файла, вы должны просто "исправить" его, если оно не в том формате, который вы хотите.Зачем отклонять файл только потому, что кто-то неудачно называет свои файлы или содержит там какие-то необычные символы?Кроме того, если вы работаете с изображениями, вы можете использовать getimagesize как вы упомянули, чтобы убедиться, что это действительно загруженное изображение (должно завершиться неудачей, если это не изображение).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top