4

フォルダーを作成および削除する簡単なスクリプトがありますが、フォルダーを削除しようとすると、エラーが発生します。

コード:

<?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

フォルダを削除する方法を知っている人はいますか(うまくいけば、すべてが入っています)?また、他にも改善点があれば、コードが改善されている可能性があります。遠慮なく教えてください。:-)

ありがとう、マイク。

4

4 に答える 4

5

この回答の目的のために、ディレクトリへのすべてのアップロードを許可することのセキュリティ リスクを脇に置きます。安全ではないことはわかっていますが、この問題は元の質問の範囲外だと思います。

誰もが言ったように、それは許可の問題である可能性があります。ただし、コードでディレクトリを作成したため (削除されたときに同じユーザーとして実行されている可能性が最も高い)。それは間違いない。

ディレクトリを削除するには、次のことを確認する必要があります。

  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;
  }
}
于 2009-08-01T18:34:12.483 に答える
5

一般的に言えば、Unix/Linux の PHP スクリプトは "nobody" ユーザーとして実行されます。つまり、"all" 権限が必要なため、ディレクトリのパーミッションの問題です。また、Linux/Unix でファイルまたはディレクトリを削除するには、親ディレクトリに対する書き込み権限が必要です。それがあなたの問題かもしれません。

作成したファイルまたはディレクトリに問題がある場合はchmod()、それらに対して使用して適切な権限を設定してください。

また、空でない場合もあります。

また、特筆すべきは、

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

セキュリティの観点からは本当に悪いです。その入力をサニタイズします。

于 2009-08-01T17:13:10.493 に答える
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/

これがやりたいことであり、アプリケーションが安全であることを確認してください。セキュリティ上の問題が発生する可能性があるため、アプリケーションに書き込み権限を付与しないでください。

于 2009-08-01T17:29:14.580 に答える
0

Web サーバーには、削除しようとしているフォルダーへの書き込みアクセスが必要です。これには次のものを提供できます。

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

ここで、www-data は Web サーバーを実行するユーザーです (OS とサーバーのインストールに応じて、Apache またはいくつかのバリエーションの場合があります)。この後、実行できますrmdir(またはrm -rディレクトリが空でない場合)。

また、Web サーバーにディレクトリへの書き込み機能を付与すると、セキュリティ上の問題が生じることに注意してください。特定の状況では、これにより、悪意のあるユーザーが任意のコードを実行したり (マシンを乗っ取ったり)、Web サイトを変更したり (サーバー スパイウェア) する可能性があります。

これらの理由から、次のような書き込み権限のみをディレクトリに付与する必要があります。

  • 絶対に必要
  • ソースコードを含まない
  • スクリプトを含むディレクトリの外にあります
  • サーバーが所有

本番マシンでのこのセットアップでは、Apache のみが書き込みできる、このタイプのファイル専用の別のディレクトリをセットアップできます。このディレクトリにファイルを展開する必要がある場合は、sudoまたは root アカウントを使用して、アクセスできるアカウントを制限してください。

私が意味することのより完全な説明については、Apache ドキュメントのセキュリティに関するヒントのセクションをご覧ください。

于 2009-08-01T17:15:00.490 に答える