2012-10-12 68 views
0

可能重複:
How can I only allow certain filetypes on upload in php?只允許jpg和.png文件只

我怎樣才能讓下面僅腳本允許.jpg圖像或.png圖像? 它根據會話用戶名匹配將圖像目錄上傳到mysql表。是否可以限制文件類型?因爲我只需要.jpg或.png

if ($_POST['submit']) { 
    //get file attributes 

    $Name = $_FILES['myfile']['name']; 
    $tmp_name = $_FILES['myfile']['tmp_name']; 
    error_reporting(E_ERROR | E_PARSE); 

    if ($Name) {    
    $location = "avatars/$Name";  
    move_uploaded_file($tmp_name, $location) or die('Failed to upload picture'); 
    $query = mysql_query("UPDATE fgusers3 SET imagelocation='$location' WHERE name='$name'") or die("Your profile image has been uploaded!"); 

    }} 



echo "Upload your image below: 
    <form action='profilepic.php' method='POST' enctype='multipart/form-data'> 
    Profile Picture: <input type='file' name='myfile'> <input type='submit' name='submit' value='upload'> 
    </form>"; 
+0

請注意有幾種方法來欺騙擴展,MIME類型等。處理上傳的文件時請注意這一事實。 –

回答

1

您可以嘗試使用pathinfo & exif_imagetype

if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG) 
{ 
    // throw error 
} 

See More Info to detect Fake Images

+1

你太快了;) – GBD

+0

@hakre說過一次.....謝謝:) – Baba

0
$whitelist = array(".jpg",".png"); 
foreach ($whitelist as $item) { 
    if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) { 
    $uploaddir='uploads/uploads_image/'; 
    // or code 
    } 
} 
+0

這個安全嗎? ESP。反對將腳本上傳到RCE? – evandrix

1
if($_FILES){ 
    $allowedExtensions = array("jpg","png"); 

    foreach($_FILES as $key=>$val){ 
     if(!empty($val['tmp_name'])){ 
      $ext = end(explode(".",strtolower(basename($val['name'])))); 
      if(in_array($ext,$allowedExtensions)){ 
       $file = 'PATH_TO_UPLOAD'.basename($val['name']); 

       if(move_uploaded_file($val['tmp_name'],$file)){ 
        //SUCCESS_MESSAGE 
       } 
      }else{ 
       //FAIL_MESSAGE 
      } 
     } 
    } 
} 
+0

+1沒有遇到'結束'! –

1

您可以使用exif_imagetype($tmp_name)檢查實際類型基於它的頭文件。這會根據文件的內容檢查文件的類型,因此它是最可靠的(例如,即使有人給你帶有「.png」擴展名的JPG文件,它也會給你正確的信息)。

還有type屬性($_FILES['myfile']['type']),它將爲您提供瀏覽器聲稱該文件是的MIME類型。但是,如果有人惡意僞造請求,則不可信。

0

$ imageType = getimagesize($ tmp_name); 開關($ imageType ['mime']!=「image/jpg」或$ imageType ['mim']!=「image/png」){ //錯誤代碼在這裏。 }

這比檢查擴展名更安全一些,因爲擴展名可以很容易地更改。 mime類型也可以更改,但需要更多的知識xD

0

當然,您可以通過文件擴展名進行限制,但這不是安全的。你可以嘗試重命名一個gif文件並上傳它。有點安全的是使用MIME類型來檢測文件類型(但仍然不能保證)。看看: How do I find the mime-type of a file with php?

我認爲更安全的是試圖獲取圖像的大小或如果轉換爲其他圖像類型是成功的。