2012-08-08 96 views
0

我只是想確保我正確地做到這一點。這是一個簡單的上傳類。我需要改變下面的代碼來重命名實際的圖像文件,用一個變量名稱(一個Joomla用戶ID,並保留當然的擴展名。很容易獲得登錄的用戶ID。因此,我上傳之前的圖像文件名將是任何用戶有(usersimagename.jpg),並把它轉變爲數字userid.ext喜歡通過Joomla的用戶變量填充(62.png)。用PHP重命名圖像文件

<?php 

$uploaddir = $_REQUEST['path']; 
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']); 

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { 
echo "success"; 
} else { 
// WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE! 
// Otherwise onSubmit event will not be fired 
echo "error"; 
} 

?> 
+1

而你的問題是?你的問題中沒有一個問號。 – 2012-08-08 18:52:49

+0

什麼是php函數[rename](http://php.net/manual/de/function.rename.php)? – Stony 2012-08-08 18:52:36

回答

1

如果我理解你的問題的權利,你要保持文件的擴展名,而我不知道Joomla變量,但像這樣的東西應該工作

<?php 
    $ext = strrchr($_FILES['userfile']['name'],"."); 

    $uploadfile = $uploaddir . $JOOMLAID . $ext; 
?> 

然後按照這與休息的代碼。

您也可以將$ JOOMLAID替換爲您能想到的任何生成的名稱。

+0

謝謝,我知道這是類似的東西。 – decaye 2012-08-08 19:08:46

0

該代碼本身運行良好,但邏輯上是一場噩夢。您允許用戶爲最終存儲位置指定路徑和文件名。考慮如果惡意用戶進入您的網站會發生什麼情況。他們可以輕鬆地取代您的服務器上的ANY文件,您的網絡服務器的用戶ID可以訪問該文件。

例如

$_REQUEST['path'] = '/etc/'; 
$_FILES['userfile']['name'] = 'passwd'; 

$_REQUEST['path'] = 'c:\windows\system32\'; 
$_FILES['userfile']['name'] = 'ntoskrnl.exe'; 

,而這些都只是震盪價值的例子,不太可能是您的網絡服務器修改的,它是你的代碼怎麼會輕易讓別人完全PWN一個例子你服務器。