PHP - rmdir (reddedildi)

4 Cevap php

Ben bir klasör oluşturmak ve silmek kolay bir script var, ama ben bir klasörü silmeye çalıştığınızda, o kadar ve hata getiriyor.

Kodu:

<?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);
}
?>

Hata msg:

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

Does anyone know how to delete the folder (hopefuly with everything inside) ? Also if you see any other improvments, the code could have, feel free to tell me. :-)

Teşekkürler, Mike.

4 Cevap

Unix / Linux üzerinde genellikle konuşan PHP betikleri bu dizinde izinleri bir sorun var bu yüzden "tüm" ayrıcalıkları gerekir, yani kullanıcı "kimse" olarak çalıştırın. Ayrıca, Linux / Unix, bir dosya veya dizin silmek için size parent directory yazma ayrıcalıkları gerekir. Bu senin sorunun olabilir.

Eğer doğru izinlerini ayarlamak için onlara oluşturduğunuz dosyaları veya dizinleri, kullanım chmod() ile ilgili sorunlar varsa.

Ayrıca boş olmayabilir.

Ayrıca, kayda değer olduğunu

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

Görüş güvenlik açısından really kötü. Bu girdiyi.

Bu cevap amaçla, ben bir kenara dizindeki herhangi ve tüm yüklenenler izin güvenlik riskleri koyacağız. Ben güvenli olmadığını biliyorum, ama ben bu sorunu outside the scope of the original question hissediyorum.

Herkesin dediği gibi, bu bir izin sorunu olabilir. Ancak (silindi zaman büyük olasılıkla aynı kullanıcı olarak çalışıyorsa) kodunuzda dizin oluşturduk beri. O olduğunu sanmıyorum.

Bir dizini silmek için, emin olmak gerekir:

  1. (Herkesin belirttiği gibi) Eğer uygun izinlere sahip.

  2. All directory handles must be closed prior to deletion.
    (leaving handles open can cause Permission denied errors)

  3. Dizin must be empty. rmdir(), sadece dizini değil, içindeki dosyaları siler. Şeyler hala içeride varsa Yani onun işini yapamaz.

2 sayısını düzeltmek için, bu son derece basit. Eğer böyle bir şey kullanıyorsanız:

$hd = opendir($mydir);

Önce silinmesi için kolu kapatın:

closedir($hd);

3 için, ne yapmak istediğiniz bir özyinelemeli silme denir. Bunu başarmak için aşağıdaki işlevi kullanabilirsiniz:

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;
  }
}

Eğer düzenlemek için çalışıyoruz klasöre erişim haklarına gerek gibi görünüyor.

Bunu değiştirmek için:

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

ya da belki yapmanız gerekir

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

Bu yapmak istediğiniz ne olduğunu ve uygulama güvenli olduğunu emin olun. Bu güvenlik konularında yol açabilecek bu yana herhangi bir uygulama için yazma hakkı vermez.

Webserver silmek için çalışıyoruz klasörüne yazma erişimi gerektirir. Sen ile bu sağlayabilir:

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

www-data web sunucusu (OS ve sunucu kurulumu bağlı apache ya da bazı farklılıklar olabilir) altında çalışır kullanıcı nerede. (Dizin boş değilse veya rm -r) Bundan sonra rmdir çalıştırabilirsiniz.

Ayrıca, unutmayın ki web sunucusunu veren the ability to write to a directory posses security problems. Bazı durumlarda, bu (yani sunucu spyware) web (yani makinenizi devralmak), veya değiştirmek kötü niyetli bir kullanıcının rasgele kod çalıştırmasına izin verebilir.

Bu nedenlerle, yalnızca DIRS perma yazmak vermek gerektiğini:

  • kesinlikle onları ihtiyaç
  • kaynak kodu içermez
  • komut dosyalarını içeren dir dışında
  • Sunucu tarafından sahip

Bir üretim makinede bu kurulumda, sadece Apache yazabilir ki, sadece bu dosya türü için ayrı bir dizin kurmak olabilir. Eğer, bu dizine dosyaları dağıtmak erişimi hesaplarını sınırlamak için bunu yapmak için sudo veya root hesabı kullanmak zorunda kalırsanız.

Ne demek istediğimi daha eksiksiz bir açıklaması için, Apache belgelerinde security tips bölümüne bakabilirsiniz.