Перейти к содержимому



Проверка расширения файла регуляркой

#1 Kuchuluk

Kuchuluk
  • Пользователь
  • 315 сообщений
  • Репутация: 5
0

Отправлено 19 Март 2013 - 19:51

сделал код для проверки расширения файла
$file_name = "dreamweaver...exe";
$a = preg_match_all("#\.#",$file_name,$karman);
var_dump($karman);
if (count($karman[0]) != 1)
{
echo "Расширение файла задано не правильно";
}
else
{
$rashirenie = preg_match("#.+?\.([a-z]+)#",$file_name,$karman);
var_dump($karman);
$a = $karman[1];
switch ($a)
{
  case "exe" : $vivod = "Исполняемый файл. Расширение exe"; break;
  case "doc" : $vivod = "Вордовский документ. Расширение doc"; break;
  case "txt" : $vivod = "Текстовый файл. Расширение txt"; break;
  case "jpg" : $vivod = "Точечный рисунок. Расширение jpg"; break;
  case "jpeg" : $vivod = "Точечный рисунок. Расширение jpeg"; break;
  case "gif" : $vivod = "Точечный рисунок. Расширение gif"; break;
}
echo "<br>".$vivod."<br><br>";
}
первое условие проверяет - если в файле больше одной точки, то файл не допускается, это для того чтобы пользователи не могли закачать на сервер файл с двойным расширением. Но ведь в названии файла могут использоваться точки, но но этот код получается не допустит такой файл. Не могу никак придумать так, чтобы скрипт проверял наличие точки именно перед расширением, а не во всем имени файла. Может кто делал что-нибудь подобное, подскажите пожалуйста.

 

 

  • 0

#2 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 19 Март 2013 - 20:22

Kuchuluk, используйте, например, такую функцию
function get_file_extension($fname) {
  return pathinfo($fname, PATHINFO_EXTENSION);
}
Она работает с неограниченным количеством точек в имени файла.
И не морочьте себе голову регулярками, это не тот случай.

Но если очень хочется, то вот функция с регэкспом
function get_file_extension($fname) {
  return preg_replace("/.*?./", '', $fname);
}

  • 0

#3 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 19 Март 2013 - 20:56

спасибо. еще можно уточнить - эта функция не уязвима для хакеров? если пользователь попытается загрузить исполняемый файл, но в конце припишет расширение например jpg?


  • 0

#4 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 19 Март 2013 - 21:02

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


  • 0

#5 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 19 Март 2013 - 21:09

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


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

а есть функция, которая проверяет сам тип файла?
  • 0

#6 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 19 Март 2013 - 21:10

Существует много вариантов контроля. И проверять надо, естественно, не имя файла, а содержимое. Хотя файлы с расширением php — можно и нужно отсекать сразу.
Вот, например, статья на эту тему: Безопасная загрузка изображений


  • 1

#7 Kuchuluk

Kuchuluk
    Topic Starter
  • Пользователь
  • 315 сообщений
  • Репутация: 5

Отправлено 19 Март 2013 - 21:19

yury, спасибо огромное! очень хорошая статья!
  • 0


Оформление форума – IPBSkins.ru