2015-08-08 125 views
0

自己一直在使用我的PHP上傳腳本,但遇到了阻止覆蓋現有文件的問題,該怎麼做。請要求提示和解釋。如果我的方式來處理上傳是好的,如果不是,請告知並給出提示。在我看來如何防止PHP上傳腳本覆蓋現有文件?

$destination = 'C:/upload_test/'; 
$max=75200; 
if (isset($_POST['upload'])) { 
if (isset($_FILES['image']['tmp_name'])) { 
$fileTaille= $_FILES['image']['size']; 
if ($fileTaille==true) { 
if ($fileTaille > $max) { 
    echo "Your file is too large, select a file smaller than"; 
    exit(include 'form.php'); 
    } 
} 
    else { 
    echo "No file selected"; 
    exit(include 'form.php'); 
    } 
} 

$file_type=getimagesize($_FILES['image']['tmp_name']); 

if ($file_type==true) { 
    echo "File is an image - " .$file_type["mime"]." "; 
} 
    else{ 
    echo "Could not get file type"; 
    } 

$fileType = exif_imagetype($_FILES['image']['tmp_name']); 
$allowed = array(IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF); 

if (!in_array($fileType, $allowed)) { 
    echo "File type not accepted, Only JPEG file allowed"; 
    exit(include 'form.php'); 
} 

$clean_file = preg_replace("/[^A-Z0-9\.\_-]/i", " ", $_FILES["image"]["name"]); 
$fileName = $destination . basename($clean_file); 
if (file_exists($fileName)) { 
    echo "File already exist"; 
    exit(include 'form.php'); 
} 

} 

if (isset($_FILES['image']['tmp_name'])) { 
$result = move_uploaded_file($_FILES['image']['tmp_name'], $destination . $_FILES['image']['name']); 

    if ($result == true) { 
    echo "file moved "." "; 
    }else 
    { 
    echo "Could not move filed"; 
    } 
$permission = chmod($destination . $clean_file, 0644); 
    if ($permission==false) { 
    echo "No permission to the file"; 
    } 
    else 
    { 
    echo "permission given"; 
    } 
} 
?> 
+1

提示:閱讀[在PHP文件上傳手冊頁](http://php.net/manual/en/features.file-upload.php的)我注意到最明顯的是你沒有在任何地方檢查'['error']' – RiggsFolly

+0

你也試圖上傳到一個我認爲在DocumentRoot之外的文件夾。嘗試將其更改爲網站的子文件夾,而不是完全獨立的文件夾,至少在您獲得它的工作之前。 – RiggsFolly

+0

@RiggsFolly是的,我只在我的DocumentRoot之外上傳,僅用於在本地計算機上進行測試.. –

回答

0

最佳做法是使文件的SHA256,然後保存它,這樣你就不會覆蓋文件,你也不要保存重複的文件。

如何做到這一點:

  1. 上傳文件到一個臨時目錄
  2. 哈希文件並獲得SHA256字符串。
  3. 重命名文件並複製到上傳文件夾。

例子:

$clean_file = preg_replace("/[^A-Z0-9\.\_-]/i", " ", $_FILES["image"]["name"]); 
$fileName = hash_file('sha256', $clean_file); 
rename($clean_file, $fileName.$extention); 
+0

我不會保留擴展名 - 儘管應該明確檢查PHP文件和其他服務器可執行文件,並且文件應該上傳到某個區域儘管如此,PHP文件並不是Web可達的,但完全放棄擴展是一個很好的習慣。 – halfer

+0

@halfer我真的不明白你的意思..你能告訴我怎麼用代碼? –

+0

@ rebelfreak:你想從網絡上提供這些文件嗎?如果是這樣,你需要保留擴展名(除非你不介意使用動態PHP腳本來服務它們,但這很慢)。 – halfer

0

您正在搜索的文件和要保存該文件有不同的名稱。您正在搜索名稱爲$clean_file的文件,但保存爲$_FILES['image']['name']。您應該更新代碼,將其保存爲$clean_file

$result = move_uploaded_file($_FILES['image']['tmp_name'], 
    $destination . $clean_file 
); 
+0

感謝您的觀察..做了更正 –