Какова наилучшая бизнес-практика по проверке имени файла?
-
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
как вы упомянули, чтобы убедиться, что это действительно загруженное изображение (должно завершиться неудачей, если это не изображение).