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

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

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

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

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

Δημοσίευση από ManosApp » 15 Οκτ 2013 01:50

Με ένα πάρα πολύ απλό κομμάτι κώδικα ανεβάζω εικόνες σε ένα φάκελο, δεν υπάρχουν περιορισμοί απλά πράγματα.

Στον φάκελο αυτό όπου υπάρχουν οι ανεβασμένες εικόνες, έχω τοποθετήσει ένα αρχείο parathesi.php με τον εξής κώδικα έτσι ώστε να μου εμφανίζει μια λίστα όλων των εικόνων που έχει ο φάκελος αυτός :

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

<?php

  if &#40;$handle = opendir&#40;'.'&#41;&#41; &#123;
        while &#40;false !== &#40;$entry = readdir&#40;$handle&#41;&#41;&#41; &#123;
            if &#40;$entry != "." && $entry != ".."&#41; &#123;
                echo "$entry\n";
            &#125;
        &#125;
        closedir&#40;$handle&#41;;
   &#125;
?>
Ως εδώ μια χαρά, θα ήθελα όμως δίπλα από κάθε γραμμή με το όνομα-link του αρχείου που μου δίνει η echo να υπάρχει και μια ένδειξη διαγραφής του κάθε αρχείου εικόνας, πως θα πετύχω κάτι τέτοιο ;

Ας πούμε αν η εικόνα είναι topio1.jpg πλάι να υπάρχει ένα X το οποίο όταν το πατάμε να διαγράφει το topio1.jpg και να αφήνει τις υπόλοιπες εικόνες ανέπαφες.
Τελευταία επεξεργασία από το μέλος ManosApp την 15 Οκτ 2013 04:09, έχει επεξεργασθεί 1 φορά συνολικά.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

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

Δημοσίευση από geomagas » 15 Οκτ 2013 02:24

Για κάθε αρχείο, πρόσθεσε μία φόρμα με ένα hidden πεδίο με τιμή το filename, και ένα submit.

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

<?php

  if &#40;$handle = opendir&#40;'.'&#41;&#41; &#123;
        while &#40;false !== &#40;$entry = readdir&#40;$handle&#41;&#41;&#41; &#123;
            if &#40;$entry != "." && $entry != ".."&#41; &#123;
                echo "$entry\n"; 
?>
  <form method='post'>
    <input type='hidden' name='filename' value='<?php echo $entry; ?>'>
    <input type='submit' value='Διαγραφή'>
  </form>
<?
            &#125;
        &#125;
        closedir&#40;$handle&#41;;
   &#125;
?>

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

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

Δημοσίευση από ManosApp » 15 Οκτ 2013 02:32

Ναι αλλά ποιος ο κώδικας για τη διαγραφή του εκάστοτε αρχείου καθ αυτό το τρόπο τότε ; Πως δηλαδή θα ξεχωρίσουμε το ένα από το άλλο αρχείο αφού δεν έχουν ας πούμε κάτι σαν id που θα είχαν αν ήμασταν σε μια βάση δεδομένων ;

thomasd
Δημοσιεύσεις: 30
Εγγραφή: 27 Ιουν 2013 10:57

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

Δημοσίευση από thomasd » 15 Οκτ 2013 02:34

Στο σημείο που εκτυπώνεις το όνομα του αρχείου μπορείς να βάλεις ένα link διαγραφής.
Π.χ. echo $entry.'[<a href="toarxeiosou.php?file='.$entry.'">X</a>]\n';

Στην συνέχεια θα πρέπει πριν τον κώδικα που παρέθεσες να ελέγξεις αν έχει οριστεί η $_GET['file'], και αν έχει οριστεί να χρησιμοποιήσεις την unlink για να διαγράψεις το αρχείο.
html/css/php/mysql/jquery/ajax programmer

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

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

Δημοσίευση από ManosApp » 15 Οκτ 2013 04:08

Σας ευχαριστώ το κατάφερα !

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

<?php

if&#40;isset&#40;$_GET&#91;'erase'&#93;&#41;&#41;
&#123;
$svise=$_GET&#91;'erase'&#93;;
unlink&#40;$svise&#41;;
&#125;

?>
Μου μένει άλλο ένα όμως γιατί παρατηρώ ότι στην εμφανιζόμενη λίστα μου αναφέρει και το αρχείο .php που τρέχω το script αυτό parathesi.php, γίνεται με κάποιο τρόπο να το κάνω να μην εμφανίζετε στη λίστα αν ναι πώς ;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

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

Δημοσίευση από geomagas » 15 Οκτ 2013 09:03

Με τον ίδιο τρόπο που κάνεις να μην εμφανίζονται και τα '.' και '..'
Hint: Χρησιμοποίησε τη σταθερά __FILE__ αντί του filename.

Αν και εγώ θα σου έλεγα να το διαχωρίσεις από το upload directory ούτως ή άλλως.
Μην ξεχνάς ότι, έχοντας επιλέξει τη μέθοδο GET έναντι της POST, και αφού δεν βάζεις έξτρα ελέγχους στη διαδικασία delete, o καθένας κι απ' οπουδήποτε μπορεί να κάνει

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

http&#58;//yourdomain.example.tld/myuploads/delete.php?delete.php
Δεν ξέρω αν με "πιάνεις"... Χρειάζεται να συνεχίσω με παραδείγματα με relative paths? ;)

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

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

Δημοσίευση από ManosApp » 15 Οκτ 2013 16:53

geomagas έγραψε: Αν και εγώ θα σου έλεγα να το διαχωρίσεις από το upload directory ούτως ή άλλως.
Μην ξεχνάς ότι, έχοντας επιλέξει τη μέθοδο GET έναντι της POST, και αφού δεν βάζεις έξτρα ελέγχους στη διαδικασία delete, o καθένας κι απ' οπουδήποτε μπορεί να κάνει

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

http&#58;//yourdomain.example.tld/myuploads/delete.php?delete.php
Δεν ξέρω αν με "πιάνεις"... Χρειάζεται να συνεχίσω με παραδείγματα με relative paths? ;)
Δεν σε "πιάνω" και αυτό γιατί δεν έχω ιδιαίτερες γνώσεις όσο ασχολούμαι είναι απλά από ενδιαφέρον και πάντα ερασιτεχνικά :)

Έχει ενδιαφέρον αυτό όμως που είπες, όταν λες να το διαχωρίσω από το upload directory τι εννοείς πως ;

Έβαλα ένα session για προστασία στη σελίδα αυτή όμως δοκιμάζοντας να τρέξω τη διεύθυνση http://yourdomain.example.tld/myuploads ... delete.php εκτός session παρατήρησα ότι το αρχείο διαγράφηκε ! Νόμιζα ότι δεν θα διαγραφόταν αφού η σελίδα προστατεύεται από session.

Χρησιμοποιώντας GET δεν υπάρχει ένας απλός τρόπος να το προστατέψω ; Τι λύσεις υπάρχουν ; Καλό θα ήταν όμως αυτό που θέλεις να μου πεις να το έγραφες και σε κώδικα έτσι ώστε να μπορέσω να καταλάβω τι εννοείς κάθε φορά θα με βοηθούσε πάρα πολύ.

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

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

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

ManosApp έγραψε:Δεν σε "πιάνω" και αυτό γιατί δεν έχω ιδιαίτερες γνώσεις όσο ασχολούμαι είναι απλά από ενδιαφέρον και πάντα ερασιτεχνικά :)
Οκ. Φαντάσου τι θα γινόταν (με τα "κατάλληλα" δικαιώματα) αν κάποιος έκανε πχ:

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

http&#58;//yourdomain.example.tld/myuploads/delete.php?erase=../index.php
ManosApp έγραψε: Έχει ενδιαφέρον αυτό όμως που είπες, όταν λες να το διαχωρίσω από το upload directory τι εννοείς πως ;
Εννοούσα να διαχωρίσεις τα directories. Σε άλλο τα αρχεία που μπορεί να σβήνει ο επισκέπτης και σε άλλο ο κώδικας ή κρίσιμα δεδομένα. Και με άλλα δικαιώματα το καθένα.
ManosApp έγραψε: Έβαλα ένα session για προστασία στη σελίδα αυτή όμως δοκιμάζοντας να τρέξω τη διεύθυνση http://yourdomain.example.tld/myuploads ... delete.php εκτός session παρατήρησα ότι το αρχείο διαγράφηκε ! Νόμιζα ότι δεν θα διαγραφόταν αφού η σελίδα προστατεύεται από session.
...Τι εννοείς "προστατεύεται από session";
(Απορώ πάντως πως το έσβησε, αφού σύμφωνα με το δικό σου κώδικα θα έπρεπε να είναι http://yourdomain.example.tld/myuploads ... delete.php)
ManosApp έγραψε: Χρησιμοποιώντας GET δεν υπάρχει ένας απλός τρόπος να το προστατέψω ; Τι λύσεις υπάρχουν ; Καλό θα ήταν όμως αυτό που θέλεις να μου πεις να το έγραφες και σε κώδικα έτσι ώστε να μπορέσω να καταλάβω τι εννοείς κάθε φορά θα με βοηθούσε πάρα πολύ.
Λύσεις υπάρχουν πολλές. Μία από όλες σου είπα παραπάνω.
Μία άλλη θα ήταν να ελέγξεις, πριν διαγράψεις, αν αυτό που πήρες με το $_GET['erase'] αφορά κάτι που δεν πρέπει να διαγραφεί.
Φυσικά, το να φιλτράρεις το αντίστοιχο link από τη σελίδα σου είναι σκόπιμο, διότι τελικά δεν έχει νόημα να φαίνεται. Αλλά αυτό δεν είναι προστασία.

thomasd
Δημοσιεύσεις: 30
Εγγραφή: 27 Ιουν 2013 10:57

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

Δημοσίευση από thomasd » 15 Οκτ 2013 19:56

Αν έχουν πρόσβαση και άλλοι στη σελίδα σου και όχι μόνο εσύ τότε καλύτερα να χρησιμοποιήσεις την post μέθοδο όπως σου έδειξε ο geomagas.

Αν θέλεις υποχρεωτικά να χρησιμοποιήσεις την get μέθοδο τότε θα πρέπει πριν την διαγραφή να κάνεις μια σειρά από ελέγχους για να διασφαλίσεις την ασφάλεια των αρχείων σου.
Για παράδειγμα, μπορείς να ελέγξεις αν το αρχείο είναι αρχείο εικόνας, αφού τέτοια θέλεις να διαγράψεις. Ακόμα, μπορείς να ελέγξεις αν το directory από το οποίο θα διαγραφεί το αρχείο είναι το σωστό.
html/css/php/mysql/jquery/ajax programmer

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

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

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

Ώπα παιδιά σιγά σιγά γιατί μαζεύτηκαν αρκετά θέματα και έχω πελαγώσει κάπως. Διάβασα όσα που είπατε και μετά από αρκετό ψάξιμο έκανα μια μικρή πρόοδο σε σχέση με το αρχικό.

Ας πάρουμε τη περίπτωση $_GET ως έχει. Για να τη βελτιώσουμε, αρχικά θα πρέπει να εξασφαλίσουμε ότι μόνο αρχεία από τον φάκελο που βρίσκεται το parathesi.php (φάκελος uploads) θα μπορούν να διαγραφούν.

Δοκίμασα να το κάνω έτσι :

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

if&#40;isset&#40;$_GET&#91;'erase'&#93;&#41;&#41;&#123;
    	  $svise=$_GET&#91;'erase'&#93;;
    	  $monodir = 'uploads' . ltrim&#40;$svise, '/\\'&#41;;
    	  if &#40;dirname&#40;realpath&#40;$monodir&#41;&#41; == realpath&#40;'uploads'&#41;&#41; &#123;
        unlink&#40;$monodir&#41;;
     &#125;
 &#125;
Πρίν ήταν απλά :

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

if&#40;isset&#40;$_GET&#91;'erase'&#93;&#41;&#41;
&#123;
$svise=$_GET&#91;'erase'&#93;;
unlink&#40;$svise&#41;;
&#125;
Όμως καλώντας για διαγραφή τη διεύθυνση :

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

http&#58;//localhost/uploads/parathesi.php?erase=image1.png
Δεν διαγράφεται το αρχείο όπως παλιά... τι κάνω λάθος μπορείτε να μου εξηγήσετε ;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

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

Δημοσίευση από geomagas » 16 Οκτ 2013 08:42

Η φίλη μας η echo:

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

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' . ltrim&#40;$svise, '/\\'&#41;;
          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;

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

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

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

thomasd έγραψε:Αν έχουν πρόσβαση και άλλοι στη σελίδα σου και όχι μόνο εσύ τότε καλύτερα να χρησιμοποιήσεις την post μέθοδο όπως σου έδειξε ο geomagas.

Αν θέλεις υποχρεωτικά να χρησιμοποιήσεις την get μέθοδο τότε θα πρέπει πριν την διαγραφή να κάνεις μια σειρά από ελέγχους για να διασφαλίσεις την ασφάλεια των αρχείων σου.
Για παράδειγμα, μπορείς να ελέγξεις αν το αρχείο είναι αρχείο εικόνας, αφού τέτοια θέλεις να διαγράψεις. Ακόμα, μπορείς να ελέγξεις αν το directory από το οποίο θα διαγραφεί το αρχείο είναι το σωστό.
Οι έλεγχοι πρέπει να γίνονται ανεξάρτητα από τη μέθοδο που χρησιμοποιείται (get, post). Ό,τι μπορείς να κάνεις με την get, μπορείς να το κάνεις και με την post (με λίγο κόπο παραπάνω).

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

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

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

Έχω κολλήσει, η λίστα αρχείων που περιέχει ο φάκελος, εμφανίζεται κανονικά όμως δεν διαγράφεται το αρχείο, κανένα αρχείο, καλώντας
γιατί ;

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

<?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' . ltrim&#40;$svise, '/\\'&#41;;
          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;'.'&#41;&#41; &#123;
        while &#40;false !== &#40;$entry = readdir&#40;$handle&#41;&#41;&#41; &#123;
            if &#40;$entry != "." && $entry != ".."&#41; &#123;
                echo "$entry\n";
            &#125;
        &#125;
        closedir&#40;$handle&#41;;
   &#125;
?>

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

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

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

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

$monodir = 'uploads' . ltrim&#40;$svise, '/\\'&#41;;
Αυτό θα σου δώσει uploadsimage1.png, το οποίο δεν είναι σωστό. Επίσης, βλέπω ότι είσαι ήδη μέσα στο uploads, οπότε χρειάζεται μόνο το όνομα του αρχείου, χωρίς το directory.

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

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

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

Κάνει echo κάτι? τα path είναι σωστά?

νομίζω θα πρέπει να είναι έτσι ορισμένο το $monodir:

$monodir = 'uploads' . DIRECTORY_SEPARATOR . $svise;

Το ltrim γιατί το θέλουμε;


edit: τώρα είδα την απάντηση του gvre, αν όντως είσαι στο uploads αφενός δεν χρειάζεσαι το uploads & dir seperator, αφετέρου πρέπει να προστατεύσεις το php αρχείο σου...

Απάντηση

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

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

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