2011-08-11 187 views
1

我正在使用以下腳本。它基本上檢查被上傳文件的名稱是否已經存在,如果它應該將其重命名爲其他內容並上傳它。到目前爲止,它不起作用。要麼重命名所有文件,要麼當我嘗試通過網頁打開文件說它損壞的文件。如果名稱已經存在,如何重命名文件?

代碼:

$sql="SELECT filename FROM doc_u WHERE person_id= '$pid'"; 

    $result=mysql_query($sql); 

    $query = mysql_query($sql) or die ("Error: ".mysql_error()); 

if ($result == "") 
{ 
echo ""; 
    } 
    echo ""; 


    $rows = mysql_num_rows($result); 

    if($rows == 0) 
    { 
    print(""); 

    } 
    elseif($rows > 0) 
    { 
    while($row = mysql_fetch_array($query)) 
    { 

    $existing = $row['filename']; 

    print(""); 
    } 

    } 

    if ($filename === $existing) { 
$filename = $uniqueidgenerator.strrchr($_FILES['filename']['name'], "."); 

    } else { 
    $filename = $_FILES['filename']['name'];; 
    } 

//After checking it will move the files

 if(move_uploaded_file($_FILES['filename']['tmp_name'],$upload_path . $filename)) 
    echo ''; 
    else 
    echo ''; 

回答

2

您使用的是數據庫中已經考慮到,讓我說asplainly地:切勿使用用戶提供的文件名。相反,通過相應的數據庫記錄的主鍵ID號存儲每個上傳的文件(您正在使用自動遞增整數的ids,對嗎?)。將文件的名稱存儲在數據庫中,現在您可以擁有任意數量的「text.txt」文件,因爲每個實際的文件都將被命名爲「1」,「53」和「207」等...

+1

這是如此重要。如果你讓別人上傳somejpeg.php到你的服務器,它可以驗證爲JPEG格式,但它本身仍然有惡意代碼。有人可以使用這種方法基本上接管你的服務器。 – dqhendricks

+0

好,所以你要說取文件名並存儲在數據庫中,然後重命名正在上傳的文件。當你把它提供給用戶時,它將擁有我們給它的唯一文件名。但並不是那麼糟糕,用戶無法通過他們上傳的名稱獲取文件... – KPO

+1

當然,您只需通過PHP提供文件並輸出'header('Content-disposition:attachment; filename = ORIGINAL_FILENAME_HERE') ;'並且用戶永遠不會在服務器上看到它真的被稱爲'207'。 –

1

這裏沒有太多的代碼可以繼續。我懷疑$filename未正確初始化。所以在你的if ($filename === $existing)這真的說if(undefined === undefined)這將永遠是真實的。

我不明白爲什麼這些文件會被破壞。這可能完全是一個不同的問題。

另外,請注意您的sql語句。這是一個等待發生的SQL注入。如果您使用了準備好的語句或至少使用mysql_escape_string,那將會好很多。當然,這已被棄用,以支持準備好的陳述。

更好的工作流程是先在數據庫中插入一行文件的元數據,然後使用返回的主鍵重命名該文件。它總是保證獨一無二。

相關問題