2016-11-17 3 views
0

Я делаю основной фото-хостинг, просто чтобы загрузить изображения и изменить их размер.Restrict ".php" Загрузка файла

Все работает нормально, я также добавил accept="image/*" для моей кнопки загрузки файла, но по-прежнему можно загрузить другие файлы. Поэтому в моем PHP-коде я проверяю, является ли это образ или другой файл, поэтому, если это не изображение, я в основном удаляю его. Но у меня проблема. Если пользователь загружает файл index.php, мой индексный файл на сервере будет перезаписан и, как мой код, он удалит «index.php» так. в основном самостоятельно уничтожение.

Есть ли способ ограничить загрузку файлов до файл фактически загружен на сервер?

Или, по крайней мере, есть способ изменить корневой каталог файла, который загружен ?

Я не думаю, что ограничение JavaScript или HTML сделает что-нибудь, потому что «хакеры» могут легко его изменить в элементе проверки.

+0

Если обрабатывать загрузку файлов правильно они будут размещены во временном каталоге. Ваш файл index.php не будет перезаписан. – secelite

+0

Возможный дубликат http://stackoverflow.com/questions/9153224/how-to-limit-file-upload-type-file-size-in-php или http://stackoverflow.com/questions/7322137/php- файл-upload-how-to-limit-file-upload-type –

+0

... и затем сохраните загруженные файлы в его собственной папке, например '/ uploads /'. –

ответ

0
class Upload { 

private $destinationPath; 
private $errorMessage; 
private $extensions; 
private $allowAll; 
private $maxSize; 
private $uploadName; 
private $seqnence; 
private $imageSeq; 
public $name = 'Uploader'; 
public $useTable = false; 

function setDir($path) { 
    $this->destinationPath = $path; 
    $this->allowAll = false; 
} 

function allowAllFormats() { 
    $this->allowAll = true; 
} 

function setMaxSize($sizeMB) { 
    $this->maxSize = $sizeMB * (1024 * 1024); 
} 

function setExtensions($options) { 
    $this->extensions = $options; 
} 

function setSameFileName() { 
    $this->sameFileName = true; 
    $this->sameName = true; 
} 

function getExtension($string) { 
    $ext = ""; 
    try { 
     $parts = explode(".", $string); 
     $ext = strtolower($parts[count($parts) - 1]); 
    } catch (Exception $c) { 
     $ext = ""; 
    } 
    return $ext; 
} 

function setMessage($message) { 
    $this->errorMessage = $message; 
} 

function getMessage() { 
    return $this->errorMessage; 
} 

function getUploadName() { 
    return $this->uploadName; 
} 

function setSequence($seq) { 
    $this->imageSeq = $seq; 
} 

function getRandom() { 
    return strtotime(date('Y-m-d H:i:s')) . rand(1111, 9999) . rand(11, 99) . rand(111, 999); 
} 

function sameName($true) { 
    $this->sameName = $true; 
} 

function uploadFile($fileBrowse) { 
    $result = false; 
    $size = $_FILES[$fileBrowse]["size"]; 
    $name = $_FILES[$fileBrowse]["name"]; 
    $ext = $this->getExtension($name); 
    if (!is_dir($this->destinationPath)) { 
     $this->setMessage("Destination folder is not a directory "); 
    } else if (!is_writable($this->destinationPath)) { 
     $this->setMessage("Destination is not writable !"); 
    } else if (empty($name)) { 
     $this->setMessage("File not selected "); 
    } else if ($size > $this->maxSize) { 
     $this->setMessage("Too large file !"); 
    } else if ($this->allowAll || (!$this->allowAll && in_array($ext, $this->extensions))) { 

     if ($this->sameName == false) { 
      $this->uploadName = $this->imageSeq . "-" . substr(md5(rand(1111, 9999)), 0, 8) . $this->getRandom() . rand(1111, 1000) . rand(99, 9999) . "." . $ext; 
     } else { 
      $this->uploadName = $name; 
     } 
     if (move_uploaded_file($_FILES[$fileBrowse]["tmp_name"], $this->destinationPath . $this->uploadName)) { 
      $result = true; 
     } else { 
      $this->setMessage("Upload failed , try later !"); 
     } 
    } else { 
     $this->setMessage("Invalid file format !"); 
    } 
    return $result; 
} 

function deleteUploaded() { 
    unlink($this->destinationPath . $this->uploadName); 
} 

}

Как использовать:

function callMe(){ 
       $uploader = new Upload(); 
       $directory = "NAMEDIR" 
       if(!is_dir($directory)){ 
        mkdir($directory); 
       } 
       $uploader->setDir($directory); 
       $uploader->setExtensions(array('jpg','jpeg','png','gif')); //allowed extensions list// 
       $uploader->setMaxSize(.5);       //set max file size to be allowed in MB// 
       $uploader->sameName(true); 
       if($uploader->uploadFile('file')){ //txtFile is the filebrowse element name //  
        $image = $uploader->getUploadName(); //get uploaded file name, renames on upload// 

        echo json_encode(array("success"=>true,"message"=>"Success Add","image"=>$directory.$image,"image_upload"=>$image)); 

       }else{//upload failed 
        echo json_encode(array("success"=>false,"message"=>$uploader->getMessage(),"image"=>"")); 
       } 
      } 
      callMe();