Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από ManosApp » 17 Οκτ 2013 18:31

Αντικατέστησα το

Κώδικας: Επιλογή όλων

$monodir = 'uploads' . ltrim($svise, '/\\');
με το

Κώδικας: Επιλογή όλων

$monodir = 'uploads' . DIRECTORY_SEPARATOR . $svise; 
Όμως ξανά το αρχείο, τα αρχεία δεν διαγράφονται. Γιατί ;
Με όσα ξέρω μου είναι δύσκολο εδώ να καταλάβω ποιοό είναι το λάθος είναι αρκετές νέες έννοιες για εμένα οπότε δείξτε κατανόηση παρακαλώ.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από alou » 17 Οκτ 2013 18:37

Με την προϋπόθεση ότι

scriptname.php
uploads/eikona.jpg
uploads/eikona2.jpg

δηλαδή οι εικόνες είναι σε dir uploads μετά το σημείο που βρίσκεται το php αρχείο, το κάνεις ακριβώς έτσι:

Κώδικας: Επιλογή όλων

<?php

echo "Executing ".$_SERVER&#91;'SCRIPT_NAME'&#93;."<br>";
echo "Current code in ".__FILE__."<br>";
if&#40;isset&#40;$_GET&#91;'erase'&#93;&#41;&#41;&#123;
         $svise=$_GET&#91;'erase'&#93;;
          echo "\$svise=$svise<br>";
         $monodir = 'uploads' . DIRECTORY_SEPARATOR.$svise;
          echo "\$monodir=$monodir<br>";
         if &#40;dirname&#40;realpath&#40;$monodir&#41;&#41; == realpath&#40;'uploads'&#41;&#41; &#123;
        unlink&#40;$monodir&#41;;
        echo "File $monodir deleted, hope you've kept backups, JIC<br>";
     &#125;
   else &#123;
     echo "dirname&#40;realpath&#40;'$monodir'&#41;&#41;!=realpath&#40;'uploads'&#41; ";
     echo "because realpath&#40;'uploads'&#41;==".realpath&#40;'uploads'&#41;;
     echo "and dirname&#40;realpath&#40;'$monodir'&#41;&#41;==".dirname&#40;realpath&#40;'$monodir'&#41;&#41;."<br>";
   &#125;
 &#125;

  if &#40;$handle = opendir&#40;'uploads'&#41;&#41; &#123;
        echo "<ul>";
        while &#40;false !== &#40;$entry = readdir&#40;$handle&#41;&#41;&#41; &#123;
            if &#40;$entry != "." && $entry != ".."&#41; &#123;
                echo "<li>".$entry."</li>";
            &#125;
        &#125;
        echo "</ul>";
        closedir&#40;$handle&#41;;
   &#125;
?>

ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από ManosApp » 17 Οκτ 2013 18:51

Μάλιστα ευχαριστώ εγώ είχα το αρχείο .php μέσα στον φάκελο τον ίδιο όπου βρίσκονται και οι εικόνες !
Σε αυτή τη περίπτωση τι αλλάζουμε για να δουλέψει ;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από alou » 17 Οκτ 2013 20:03

Καταρχάς είπα βλακεία για το ltrim να το αφήσεις οπωσδήποτε για να μην υπάρχει πρόσβαση σε άλλα directories.

Για την περίπτωση που λες, πρόχειρα, κάπως έτσι:

Κώδικας: Επιλογή όλων

  
<?php

echo "Executing ".$_SERVER&#91;'SCRIPT_NAME'&#93;."<br>";
echo "Current code in ".__FILE__."<br>";

if&#40;isset&#40;$_GET&#91;'erase'&#93;&#41;&#41;&#123;
      $svise= ltrim&#40;$_GET&#91;'erase'&#93;, '/\\'&#41;;
      echo "\$svise=$svise<br>";
      $monodir = $svise;
      $fullpath = dirname&#40;__FILE__&#41;.DIRECTORY_SEPARATOR.$monodir;

  if &#40;file_exists &#40;$fullpath&#41;&#41;  &#123;
      unlink&#40;$monodir&#41;;
      echo "File $monodir deleted, hope you've kept backups, JIC<br>";
  &#125; else &#123;
     echo $fullpath." does not exist.";
  &#125;
&#125;

  if &#40;$handle = opendir&#40;'uploads'&#41;&#41; &#123;
        echo "<ul>";
        while &#40;false !== &#40;$entry = readdir&#40;$handle&#41;&#41;&#41; &#123;
            if &#40;$entry != "." && $entry != ".."&#41; &#123;
                echo "<li>".$entry."</li>";
            &#125;
        &#125;
        echo "</ul>";
        closedir&#40;$handle&#41;;
   &#125;
?>

ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από ManosApp » 17 Οκτ 2013 21:31

Όταν το δοκιμάζω δεν μου εμφανίζει τα αρχεία που περιέχει ο φάκελος εσένα δουλεύει κανονικά ;


gvre
Δημοσιεύσεις: 992
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από gvre » 17 Οκτ 2013 23:16

@ManosApp Κάποια πραγματάκια που πρέπει να προσέξεις είναι τα εξής:

1. Επειδή ο φάκελος uploads κάποια στιγμή ίσως έχει υποφακέλους, πρέπει να φτιάξεις το script να δουλεύει και για όλους αυτούς, χωρίς να χρειάζεται να κάνεις αλλαγές στον κώδικα.

2. Δε σε ενδιαφέρει το περιεχόμενο της μεταβλητής $_GET['erase'], αρκεί να ελέγχεις ότι το realpath της είναι μέσα στο basedir (σταθερά __DIR__ για php >= 5.3.0 ή dirname(__FILE__) για μικρότερες εκδόσεις).

3. Το ltrim($svise, '/\\') δε σου παρέχει καμία προστασία. Αντιθέτως, είναι περισσότερο "επικίνδυνο" επειδή νομίζεις ότι σου παρέχει. Χρησιμοποίησε την realpath και με την strpos έλεγξε ότι η σύγκρισή του με το basepath σου επιστρέφει 0 (προσοχή, ο έλεγχος γίνεται με === και όχι με ==).

4. Πριν τη διαγραφή του αρχείου κάνε έναν έλεγχο για το extension του. Ο πιο απλός τρόπος είναι να βάλεις σε ένα array τις επιτρεπόμενες επεκτάσεις και να κάνεις τον έλεγχο με την in_array.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από alou » 18 Οκτ 2013 16:38

Για να μη μας τη λέει ο gvre :P ας το πάμε λίγο διαφορετικά με τις προδιαγραφές που βάζεις όμως:

Έχεις το directory που είναι και το script
Μπορούν όμως να υπάρχουν και child directories και να μπορέσεις να σβήσεις εκεί αρχεία

Αυτό το κάνεις στη συγκεκριμένη περίπτωση δίνοντας και μια 2η παράμετρο, folder

?erase=filename.jpg&folder=subfoldername

Στο directory listing, βλέπεις τα αρχεία του φακέλου που είσαι καθώς και τους υποφακέλους με τα αρχεία τους ξεχωριστά.

Δέχεται αρχεία μόνο με τις καταλήξεις που ορίζεις στο $allowed

Θεωρώ ότι με το realpath και τα replacements είναι σχετικά ασφαλές...

Κώδικας: Επιλογή όλων

  
<?php

$getImageString = $_GET&#91;'erase'&#93;;
$getFolderString = $_GET&#91;'folder'&#93;;
$suspects = array&#40;'/', '\\', '..'&#41;;

if &#40;$getImageString&#41; $image= str_replace&#40;$suspects, '', $getImageString&#41;;
if &#40;$getFolderString&#41; $folder= str_replace&#40;$suspects, '', $getFolderString&#41;;

$allowed = array&#40;'png', 'jpg', 'jpeg', 'gif' &#41;;
$filetype = end&#40;explode&#40;'.', $image&#41;&#41;;

if&#40;$image&#41;&#123;
  if &#40;in_array&#40;$filetype, $allowed&#41;&#41;&#123;
    $subfolder = "";
    if &#40;$folder&#41; $subfolder = $folder.DIRECTORY_SEPARATOR;
    $imagepath = realpath&#40;dirname&#40;__FILE__&#41;.DIRECTORY_SEPARATOR.$subfolder.DIRECTORY_SEPARATOR.$image&#41;;
    if &#40; file_exists&#40;$imagepath&#41; &#41; &#123;
      unlink&#40;$imagepath&#41;;
      echo "File $imagepath deleted.<br>";
    &#125; else &#123;
      echo "File $imagepath does not exist.";
    &#125;

  &#125; else &#123;
    echo "Cant delete $filetype files<br />";
  &#125;
&#125;

  if &#40;$handle = opendir&#40;'.'&#41;&#41; &#123;
        echo "<ul>";
        while &#40;false !== &#40;$entry = readdir&#40;$handle&#41;&#41;&#41; &#123;
            if &#40;$entry != "." && $entry != ".."&#41; &#123;
                if &#40;is_dir&#40;$entry&#41;&#41; &#123;
                  //echo "<li>--&#40;folder&#41; ".$entry."</li>";
                  if &#40;$subdirHandle = opendir&#40;$entry&#41;&#41; &#123;
                    echo "<li><strong> $entry </strong><ul>";
                    while &#40;false !== &#40;$subdirname = readdir&#40;$subdirHandle&#41;&#41;&#41; &#123;
                      if &#40;$subdirname != "." && $subdirname != ".."&#41; &#123;
                        echo "<li>".$subdirname."</li>";
                      &#125;
                    &#125;
                    closedir&#40;$subdirHandle&#41;;
                    echo "</ul></li>";
                  &#125;
                &#125; else &#123;
                echo "<li>".$entry."</li>";
              &#125;
            &#125;
        &#125;
        echo "</ul>";
        closedir&#40;$handle&#41;;
   &#125;
?>

ManosApp
Δημοσιεύσεις: 48
Εγγραφή: 19 Ιούλ 2013 22:34

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από ManosApp » 19 Οκτ 2013 21:51

Ολοκληρωμένη απάντηση και δουλεύει άψογα. Αν και δεν είχα ρωτήσει για τη περίπτωση όπου ο φάκελος περιέχει υποφακέλους έτσι είναι και ένα βήμα παραπέρα.

Mε τη χρήση του array της $allowed επιλέγουμε όχι μόνο ποια αρχεία θα εμφανίζονται αλλά και ποια αρχεία ουσιαστικά μπορούν να διαγραφούν σωστά ; Έτσι δεν θα μπορεί κάποιος ποτέ να διαγράψει το αρχείο parathesi.php που βρίσκεται μέσα στο φάκελο μας uploads σωστά ; Όμως αν επιλέγουμε έτσι ποια αρχεία θα εμφανίζονται επίσης τότε γιατί εμφανίζετε και το parathesi.php στη λίστα ;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Λίστα με όλα τα αρχεία που περιέχει ένας φάκελος και δίπλα μια ένδειξη για διαγραφή του ;

Δημοσίευση από alou » 20 Οκτ 2013 11:19

Ο έλεγχος της κατάληξης γίνεται μόνο στη διαγραφή.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες