2009-08-01 223 views
2

我有一個簡單的腳本來創建和刪除一個文件夾,但是當我嘗試刪除一個文件夾時,會出現錯誤。PHP - rmdir(權限被拒絕)

代碼:

<?php 
if ($_POST['hidden']) { 
$key = "../g_test/uploads"; 
$new_folder = $_POST['nazevS']; 
$new_dir_path = $key."/".$new_folder; 
$dir = mkdir($new_dir_path);  
if($dir) 
chmod ($new_dir_path, 0777); 
} 
if ($_POST['hiddenSS']) { 
$key = "../g_test/uploads"; 
$new_folder = $_POST['nazevS']; 
rmdir($key."/".$new_folder); 
} 
?> 

錯誤信息:

Warning: rmdir(../g_test/uploads/) [function.rmdir]: Permission denied in /home/free/howto.cz/m/mousemys/root/www/g_test/upload.php on line 51 

有誰知道如何刪除的文件夾(hopefuly與裏面的一切)? 此外,如果你看到任何其他的改進,代碼可以有,隨時告訴我。 :-)

謝謝,邁克。

回答

5

一般而言,Unix/Linux上的PHP腳本以「nobody」用戶身份運行,這意味着他們需要「全部」權限,因此它是目錄的權限問題。另外,要在Linux/Unix中刪除文件或目錄,您需要父目錄的寫權限。這可能是你的問題。

如果您對創建的文件或目錄有問題,請使用chmod()來設置正確的權限。

此外,它可能不是空的。

此外,值得一提的是,

$new_folder = $_POST['nazevS']; 
$new_dir_path = $key."/".$new_folder; 

真的不好從安全角度考慮。消除該輸入。

+0

好,目錄「/上傳」有777權限和文件夾創建工作,問題是出在命令rmdir()。 – Mike 2009-08-01 17:15:45

+5

這裏有很多糟糕的安全問題。 – Imagist 2009-08-01 17:29:16

0

網絡服務器需要對您要刪除的文件夾具有寫入權限。您可以提供這跟:

chgrp -R www-data g_test/uploads 
chmod g+w g_test/uploads 

其中WWW的數據是Web服務器下運行的用戶(可能是Apache或一些變化因您的操作系統和服務器安裝上)。在此之後,您可以運行rmdir(或rm -r,如果目錄不爲空)。

另外,請記住,使Web服務器寫入目錄的能力存在安全問題。在某些情況下,這可能會允許惡意用戶運行任意代碼(即接管您的計算機)或修改您的網站(即服務器間諜軟件)。

由於這些原因,你應該只給迪爾斯寫燙髮:

  • 絕對需要他們
  • 不包含源代碼
  • 是目錄外含腳本
  • 所擁有的服務器

在生產機器上的這種設置中,您可以爲此類型設置一個單獨的目錄只有Apache可以寫入的文件。如果必須將文件部署到此目錄,請使用sudo或root帳戶來限制有權訪問的帳戶。

有關我的意思的更完整說明,請參閱Apache文檔中的security tips部分。

0

看起來您需要對您要編輯的文件夾的訪問權限。

要改變這一點:

chmod ug+rw /home/free/howto.cz/m/mousemys/root/www/g_test/ 

或者也許你需要做的

sudo chmod ug+rw /home/free/howto.cz/m/mousemys/root/www/g_test/ 

確保這是你想要做什麼,你的應用是安全的。不要給任何應用程序寫權限,因爲它可能導致安全問題。

3

爲了這個答案的目的,我將安全風險放在允許任何和所有上傳目錄放在一邊。我知道這不是安全的,但我覺得這個問題是以外的原始問題的範圍。

正如大家所說,這可能是一個權限問題。但是由於您已經在代碼中創建了目錄(這很可能在刪除時以相同的用戶身份運行)。它懷疑是這樣。

要刪除一個目錄,你需要確保:

  1. 你有適當的權限(爲大家指出)。

  2. 所有目錄句柄在刪除之前必須關閉
    (離開手柄開放會導致權限被拒絕錯誤)

  3. 目錄必須爲空rmdir()只刪除目錄,而不是裏面的文件。所以如果裏面還有東西,它就無法完成它的工作。

要確定數字2,它非常簡單。如果您使用的是這樣的:

$hd = opendir($mydir); 

刪除前關閉您的句柄:

closedir($hd); 

對於3號,你想要做什麼是所謂的遞歸刪除。您可以使用下面的函數來實現這一目標:

function force_rmdir($path) { 
    if (!file_exists($path)) return false; 

    if (is_file($path) || is_link($path)) { 
    return unlink($path); 
    } 

    if (is_dir($path)) { 
    $path = rtrim($path, DIR_SEPARATOR) . DIR_SEPARATOR; 

    $result = true; 

    $dir = new DirectoryIterator($path); 

    foreach ($dir as $file) { 
     if (!$file->isDot()) { 
     $result &= force_rmdir($path . $file->getFilename(), false, $sizeErased); 
     } 
    } 

    $result &= rmdir($path); 
    return $result; 
    } 
}