2011-02-10 7 views
9

Szukam sposobu na usunięcie pliku z serwera przy użyciu PHP. Zasadniczo mam moje pliki wymienione na stronie w ten sposób:Usuwanie pliku serwera

<ul> 
    <li><a href="delete_file.php?file=uploads/file_01.jpg">Delete File 01</a></li> 
    <li><a href="delete_file.php?file=uploads/file_02.jpg">Delete File 02</a></li> 
    <li><a href="delete_file.php?file=uploads/file_03.jpg">Delete File 03</a></li> 
</ul> 

Problem polega na tym, że nie jestem pewien, w jaki sposób dostać się mój plik delete_file.php do pracy. Wierzę, że to musi być coś takiego:

<?php 
    $path="uploads/file_01.jpg"; 
    if(unlink($path)) echo "File Deleted"; 
?> 

... ale nie jestem pewien jak zdobyć $ path, aby przejść do pliku miałem kliknął usunąć.

+0

chcesz $ _GET [ „plik”], i to jest szalone, bo mogłem dodać plik do adresu URL i go usunąć. –

+11

Co jeśli ktoś przejdzie 'delete_file.php? File = delete_file.php'? – zerkms

Odpowiedz

16

, podczas gdy musisz być niezwykle ostrożny, dając użytkownikowi możliwość usuwania plików, dam ci wystarczająco dużo liny aby powiesić

zdefiniować katalog bazowy, który będzie zawierał wszystkie pliki, które zostaną usunięte

$base_directory = '/home/myuser/'; 

następnie usuń plik

if(unlink($base_directory.$_GET['file'])) 
    echo "File Deleted."; 
+1

Może to być dobry pomysł, aby zabronić przemierzania katalogów. – drudge

+0

Dzięki za to. Pracował uczta. Masz na myśli odrzucenie przeglądania katalogu? – PHPnoob

+0

co jeśli ktoś poda ten adres URL: '/delete_file.php?file = ../../etc/passwd' – drudge

2
<?php 
    $file_to_delete = $_GET['file']; 
    if (is_file($file_to_delete)){ 
    echo (unlink($file_to_delete) ? "File Deleted" : "Problem deleting file"; 

    } 
?> 

Nie będę kłamać, nie znam lepszego sposobu sanitize z $ _GET [ „plik”] inne niż sprawdzić, czy jest to plik. Jeśli nie jest to ważny sposób, należy zadzwonić do ekspertów. (Może postępować zgodnie z wytycznymi present in this SO topic?)

+0

ilość środków odkażających, które musiałbyś zrobić, aby się zabezpieczyć, byłaby absurdalna, gdyby ta funkcja była dostępna dla każdego użytkownika końcowego. Zostawię to OP :-) – Patrick

+3

Oczyść go za pomocą ['basename()'] (http://php.net/basename), aby uniemożliwić danej osobie wpisanie czegoś w rodzaju '../../someotherfile '. – Jonah

+0

Kolejna mała prbolem, zapomniałeś ')' przed ';' na linii gdzie jest 'echo', ale wszystko inne jest w porządku –