Удаление файлов в более высоком каталоге

У меня проблемы с удалением файла из каталога более высокого уровня, я нашел этот пост и попробовал, но не повезло....:

gotdalife в gmail точка ком 25 сентября 2008 02:04

Для всех, у кого была проблема с ошибкой отказа в правах, это иногда возникает, когда вы пытаетесь удалить файл, который находится в папке выше в иерархии, в ваш рабочий каталог (т.е. при попытке удалить путь, который начинается с «../» ).

Таким образом, чтобы обойти эту проблему, вы можете использовать chdir(), чтобы изменить рабочий каталог на папку, в которой находится файл, который вы хотите отменить.

<?php
>     $old = getcwd(); // Save the current directory
>     chdir($path_to_file);
>     unlink($filename);
>     chdir($old); // Restore the old working directory     ?>

вот код, который у меня сейчас есть:

session_start();

if (!isset($_SESSION['agent']) OR ($_SESSION['agent'] !=md5($_SERVER['HTTP_USER_AGENT']))){

    require_once ('includes/login_functions.inc.php');
    $url = absolute_url();
    header("Location: $url");
    exit();
}  



$folder = $_GET['folder'];
$filename = $_GET['name'];
$path = "../gallery/photos/$folder";

if (isset($_POST['submitted'])) {

    if ($_POST['sure'] == 'Yes') {  

        $old = getcwd(); // Save the current directory
        chdir($path);
        unlink($filename);
        chdir($old); // Restore the old working directory  

    }
    else{

        echo '<p>The photo has NOT been deleted.</p>';
    }
}

Я получаю сообщение об ошибке:

Предупреждение: unlink() [function.unlink]: нет ошибок в J:\xampp\htdocs\bunker\admin\delete_file.php в строке 37

строка 37:

unlink($filename);

кто-нибудь может увидеть, что я сделал неправильно?


person alsweet    schedule 15.11.2010    source источник
comment
4.bp.blogspot.com/_Mp0d- dsENrg/S15lV3B8PHI/AAAAAAAAiA8/   -  person Ignacio Vazquez-Abrams    schedule 15.11.2010
comment
Вы пытались явно объявить путь? (например, нет ../, но реальный сложный путь) Не знаю, где это оставит вас, если это сработает/не сработает, но может быть хорошим тестом :)   -  person clifgriffin    schedule 15.11.2010
comment
Эммм, ты хоть представляешь, насколько это плохая идея? Я имею в виду передачу исходных данных в chdir и запуск unlink...? По крайней мере, сделайте некоторую сенсибилизацию, чтобы предотвратить delete_file.php?folder=../../../../../etc&file=passwd... (разрешения, вероятно, предотвратят это, но обязательно будут файлы, которые он может удалить, которые, по крайней мере, так же плохи для вас)...   -  person ircmaxell    schedule 15.11.2010


Ответы (2)


Я всегда использую абсолютные имена путей к файлам.

Я бы определил filedir как константу в вашей конфигурации, затем объединил, чтобы у вас был абсолютный путь к файлу, а затем сделал вызов unlink().

Кстати: надеюсь, вы знаете, что ваш код крайне небезопасен.

person Niels Bom    schedule 15.11.2010

Глянь сюда:

http://bugs.php.net/bug.php?id=43511

и тут

http://php.bigresource.com/Track-php-03TimDKO/

http://www.phpbuilder.com/board/showthread.php?t=10357994

Хотя я бы не рекомендовал делать это, согласно комментариям выше. Есть ли вариант другого подхода?

person SW4    schedule 15.11.2010
comment
извините, я очень новичок в php, поэтому я не знаю о каких-либо других подходах, я открыт для предложений ... все, что мне нужно сделать, это удалить выбранный файл, но, похоже, это вызывает у меня проблему за проблемой. - person alsweet; 15.11.2010