|
|
|
| Насколько, на Ваш взгляд:
1) безопасен такой загрузчик файлов?
2) что имеет смысл изменить в лучшую сторону?
<?
ini_set('display_errors','Off');
require_once("head.tpl");
$type = '';
$size = '';
$filename = '';
if(sizeof(isset($_FILES))>0)
{
$type = $_FILES['filename']['type'];
$size = $_FILES['filename']['size'];
$filename = $_FILES['filename']['name'];
}
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".php5", ".html", ".htm", ".js", ".bas", ".sc", ".cgi",);
foreach ($blacklist as $item){
$pos = stripos($filename,$item);
if(!($pos === false)){
echo("Запрещенный тип файла");
require_once("foot.tpl");
exit;
}
}
$whitelist = array(
"image/jpg",
"image/jpeg",
"image/pjpeg",
"image/jpeg2000",
"image/svg+xml",
"image/tiff",
"image/vnd.wap.wbmp",
"image/bmp",
"image/x-windows-bmp",
"image/x-win-bitmap",
"image/png",
"image/gif",
"application/acad",
"application/x-acad",
"application/autocad_dwg",
"image/x-dwg",
"application/dwg",
"application/x-dwg",
"application/x-autocad",
"image/vnd.dwg",
"drawing/dwg",
"application/msword",
"application/vnd.ms-word",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vndopenxmlformats-officedocumentwordprocessingmldocum ent",
"application/pdf",
);
foreach ($whitelist as $item)
{
if($type == "$item")
{
goto label;
}
}
echo("Допускаются к загрузке только файлы изображений и проектов");
require_once("foot.tpl");
exit;
label:
if($size > 1024*10*1024)
{
echo ("Размер файла превышает 10 мегабайт");
require_once("foot.tpl");
exit;
}
if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
{
$chars = 'abdefhiknrstyzABDEFGHKNQRSTYZ234567 89';
$numChars = strlen($chars);
$string = '';
for ($i = 0; $i < 25; $i++) {
$string .= substr($chars, rand(1, $numChars) - 1, 1);
}
$extension = strtolower(substr(strrchr($filename, '.'), 1));
move_uploaded_file($_FILES["filename"]["tmp_name"], "./upload/$string.$extension");
echo("Файл загружен. <a href=\"./upload/$string.$extension\">Ссылка на файл</a>");
} else {
echo("Ошибка загрузки файла");
}
require_once("foot.tpl");
?>
|
| |
|
|
|
|
|
|
|
для: Loneliness
(03.02.2016 в 00:34)
| | Объявить массив $whitelist сверяя его по $_FILES['filename']['type'] не означает, что обезопасили. $_FILES['filename']['type'] можно подделать, файл можно переименовать по расширению отличному от содержания. Уж тогда использовать:
<?
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$inf = finfo_file($finfo, $file); //тип файла
finfo_close($finfo);
|
И не $filename = $_FILES['filename']['name'];, а $filename = basename($_FILES['filename']['name']); И загрузку файлов в каталог нужно начинать не с проверки размеров, а с отсутствия ошибки в ключе $_FILES["filename"]["error"]. | |
|
|
|
|