Как остановить загрузку файла с именем filename.php.jpg

поэтому у меня есть этот скрипт для загрузки файлов, и да, я знаю, что это не безопасно. Как бы то ни было, моя проблема сейчас заключается в том, что я могу загружать файлы с именем filename.php.jpg. Итак, как я могу предотвратить загрузку таких файлов, как theese? Я использовал другие вещи, чтобы остановить выполнение файлов php.

<?php
$maindir = "../alla_bilder/images/";
$maindir_th = "../alla_bilder/images/thumbs/";
$uploaddir = "images/";
$uploaddir_th = "images/thumbs/";
$allowed = array('jpg','jpeg','png');
$notallowed = array('php');
$uploadOk = 1;
$max_size = 5048 * 1024;

while (list ($key, $val) = each ($_FILES))
{
if ($_FILES[$key]['size'] <= $max_size)
{
$file_ext  = pathinfo($_FILES[$key]['name'],PATHINFO_EXTENSION);
$file_name = basename($_FILES[$key]['name'],'.'.$file_ext);
if (in_array(strtolower($file_ext),$allowed))
{
$name = $_FILES[$key]['name'];
$x = 1;
while (file_exists($uploaddir.'/'.$name))
{
$name = $file_name.'['.$x.'].'.$file_ext;
$x++;
}
$name = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 22)), 0, 22). '.' .mb_strtolower ($file_ext);
if (move_uploaded_file($_FILES[$key]['tmp_name'],$uploaddir.'/'.$name))
{
chmod($uploaddir.'/'.$name, 0644);
}
else
{
die(error_get_last());
}
}
else
{
die("Invalid file type");
}
}
else
{
die("File size too big");
}
copy($uploaddir.'/'.$name, $maindir.'/'.$name);

$images = glob("images/thumbs/*.*");
foreach($images as $image)
{
$output .= '<div class="col-md-2" align="center" ><img src="' . $image .'" width="200px" height="140px" style="border:1px solid #ccc;" /></div>';
}

//thumbnail image making part
$modwidth = 200;
$modheight = 140;

list($width, $height) = getimagesize($uploaddir.'/'.$name);
$ratio_orig = $width/$height;
if ($width/$height > $ratio_orig)
{
$width = $height*$ratio_orig;
} else {
$height = $width/$ratio_orig;
}
$tn = imagecreatetruecolor($modwidth, $modheight);
//$image = imagecreatefromjpeg($uploaddir.'/'.$name);
$image = imagecreatefromstring(file_get_contents($uploaddir.'/'.$name));
imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height);
imagejpeg($tn, $uploaddir_th.'/'.$name);
imagejpeg($tn, $maindir_th.'/'.$name);

}
echo "STOP!";
?>

0

Решение

Вы можете разбить имя файла на n частей и проверить, есть ли их больше 2 (обычно это name и ext).
Если это так, выйдите изящно (или нет).
Вы также можете перебрать массив, чтобы добавить дополнительные расширения, но с — или _ вместо a.

// Split the filename into array of base and extension[s]
$parts = explode('.', $filename);
// If more than two parts, it could be a double ext case
if ( count( $parts ) > 2 ) {
die("Invalid file type");
}

Альтернативное решение:

// Split the filename into array of base and extension[s]
$parts = explode('.', $filename);
// If more than two parts, it could be a double ext case
if ( count( $parts ) > 2 ) {
$filename = array_shift($parts);
$extension = array_pop($parts);
foreach ($parts as $part) {
$filename .= ‘_’ . $part;
}
}

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

1

Другие решения

Посмотрите на finfo расширение, это позволяет определить правда Тип файла, поскольку он анализирует тип файла на уровне ОС.

http://php.net/manual/en/function.finfo-file.php

Как finfo это расширение, которое нужно будет установить и включить.

http://php.net/manual/en/fileinfo.installation.php

пример

 $path = $_FILES[$key]['tmp_name'],$uploaddir.'/'.$name;
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$whitelist = array('image/jpg');

if (in_array(finfo_file($finfo, $path), $whitelist) && move_uploaded_file($path))
{
chmod($uploaddir.'/'.$name, 0644);
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector