Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Бзопасная загрузка файлов
 
 автор: Loneliness   (03.02.2016 в 00:34)   письмо автору
 
 

Насколько, на Ваш взгляд:
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($charsrand(1$numChars) - 11);     
          }   
  
$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");

?>

  Ответить  
 
 автор: confirm   (03.02.2016 в 17:56)   письмо автору
 
   для: 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"].

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования