Webprofis is een Forum waarin je vragen kunt stellen die webgerelateerd zijn. Heb je vragen over of problemen met je Webpagina, HTML, CSS, Javascript, PHP of andere client of serverside scriptingtalen? Stel ze dan gerust op dit forum. Op dit forum zijn een aantal vrijwilligers actief die u graag met uw vragen willen helpen en u waar mogelijk een passend antwoord aanbieden. Hebt u zelf veel ervaring en kennis met betrekking tot het bovenstaande? U bent van harte welkom om uw kennis met anderen te delen!

We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.

Team Webprofis

simple filemanagement systeempje

13»

Reacties

  • bewerkt za 14 mei 2016
    PMPosts: 879
    over dat renamen:
    <td>
    <?php

    if($_POST['renamefile']) {

    if(is_dir($dir.'/'.$file)){
    rename($dir.'/'.$file, $dir.'/'.$_POST['rename']);
    }
    else {
    rename($dir.'/'.$file, $dir.'/'.$_POST['rename'].'.'.$FileExtension);
    }

    }
    ?>
    <form method="post" action="">

    <input type="text" name="rename" />
    <input type="submit" name="renamefile" value="go" />

    </form>
    </td>
    Hoe krijg ik het nu zo dat alleen de desbetreffende file gerenamed wordt? Want zo worden alle files gerenamed, inclusief folders met de nieuwe naam
    Dit staat dus in de foreach loop
  • PMPosts: 879
    ah ik heb het al uitgevogeld: dit werktmaa nu nog ff zo maken dat de file extensie ongemoeid blijft
    if($_POST['rename']) {

    if(is_dir($dir.'/'.$file)){
    rename($_POST['old_name'], $dir.'/'.$_POST['new_name']);
    }
    else {
    rename($_POST['old_name'], $dir.'/'.$_POST['new_name']);
    }

    }
    ?>
    <form method="post" action="">
    <input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" />
    <input type="text" name="new_name" />
    <input type="submit" name="rename" value="go" />

    </form>
  • bewerkt zo 15 mei 2016
    PMPosts: 879
    Dit is hem geworden: werkt perfect!
    // RENAME
    if($_POST['rename']) {

    if(is_dir($_POST['old_name'])){
    $NewDirName = $dir.'/'.$_POST['new_name'];
    rename($_POST['old_name'], $NewDirName);
    }
    elseif(!is_dir($_POST['old_name'])) {
    $FileExtension = pathinfo($_POST['old_name'], PATHINFO_EXTENSION);
    $NewFileName = $dir.'/'.$_POST['new_name'].'.'.$FileExtension;
    rename($_POST['old_name'], $NewFileName);

    }

    }

    ?>
    <form class="sfmform" method="post" action="">
    <input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" />

    <input class="new_name" type="text" name="new_name" value=""/>
    <input class="rename" type="submit" name="rename" value="go" />

    </form>
    Bij de files plakt ie er automatisch de oude extensie tegenaan; dus geen gedoe met manipuleren van extensie
    Nu nog ff de input beveiligen
  • bewerkt zo 15 mei 2016
    PMPosts: 415
    Ik weet niet wat je hier met "de input" bedoeld, maar je zult echt wel meer controles moeten uitvoeren..

    Als ik het formulier gewoon aanpas met firebug of e.o.a inspector/editor, haal ik zo je site offline ;-)
    huidig:
    <input type="hidden" name="old_name" value="<?php echo $dir.'/'.$file; ?>" />
    na firebug:
    <input type="hidden" name="old_name" value="webprofis.nl" /> // je snapt wel waar ik heen wil..

    Ook moet je niet alle characters kunnen gebruiken om te renamen, als ik penguin.jpg rename naar /aap/noot/mies/pen_guin.jpg, houd je een onbereikbare file over (pad zal dan fout zijn)
  • PMPosts: 879
    vinTage schreef:: Ook moet je niet alle characters kunnen gebruiken om te renamen, als ik penguin.jpg rename naar /aap/noot/mies/pen_guin.jpg, houd je een onbereikbare file over (pad zal dan fout zijn)
    ja dat bedoel ik met input beveiligen. Slechts een aantal karakters toelaten.\
    idd, zoals je hierboven beschrijft. Dat kan niet de bedoeling zijn. Ff denken hoe ik dat kan oplossen
  • bewerkt zo 15 mei 2016
    PMPosts: 879
    ik heb hem beveiligd door het pathinfo van de file te vergelijken met de pathinfo van $_POST['old_name']
       if($_POST['rename']) {
    if(pathinfo($dir.'/'.$file, PATHINFO_DIRNAME) != pathinfo($_POST['old_name'], PATHINFO_DIRNAME)) {
    die();
    }

    if(is_dir($_POST['old_name'])){
    $NewDirName = $dir.'/'.$_POST['new_name'];
    rename($_POST['old_name'], $NewDirName);
    }
    elseif(!is_dir($_POST['old_name'])) {
    $FileExtension = pathinfo($_POST['old_name'], PATHINFO_EXTENSION);
    //$NewFileName = $dir.'/'.$_POST['new_name'].'.'.$_POST['extension'];
    $NewFileName = $dir.'/'.$_POST['new_name'].'.'.$FileExtension;
    rename($_POST['old_name'], $NewFileName);

    }

    }
    Als je nu dus the value via firebug manipuleert (veranderd) naar een value die buiten je eigen root staat bijv in het ergste geval: <input type="hidden" name="old_name" value="index.php" /> slaat ie op die()
    Alles wat binnen je binnen je eigen root manipuleert, dus
    <input type="hidden" name="old_name" value="uploads/sfm/hash/index.php" />\
    kun je wel via inspector manipuleren maar dat is toch je eigen root; hebben anderen geen last van

    Ggoed opgemerkt overigens @vinTage want ik had daar helemaal niet bij nagedacht dat je idd via de inspector de old_name kunt wijzigen
  • bewerkt zo 15 mei 2016
    PMPosts: 879
    input beveiligd door preg_replace
     if(is_dir($_POST['old_name'])){
    $NewDirName = $dir.'/'.preg_replace('#[^a-z0-9]#i', '', $_POST['new_name']); // only allow a-z, A-Z and 0-9
    rename($_POST['old_name'], $NewDirName);
    }
    elseif(!is_dir($_POST['old_name'])) {
    $FileExtension = pathinfo($_POST['old_name'], PATHINFO_EXTENSION);
    $NewFileName = $dir.'/'.preg_replace('#[^a-z0-9]#i', '', $_POST['new_name']).'.'.$FileExtension; // only allow a-z, A-Z and 0-9
    rename($_POST['old_name'], $NewFileName);
  • bewerkt zo 15 mei 2016
    PMPosts: 879
    Nog een vraagje: ik heb voor het hele filemanagement een md5 hash gebruikt op basisi van de UserID. Voor Vanilla zijn de user ID's gewone getallen vanaf 1 t/m ...
    Zover als ik begrijp maakt md5 altijd dezelfde hash van getal 1, en ook altijd dezelfde hash van getal 2 enz.
    Maw: als je de UserID weet van je medemember, zou je erachter kunnen komen welke hash je medemember heeft.
    Nu is de url wel beveiligd tegen andere hashes maar toch...
  • Lees nog eens terug wat ik daarover gezegd heb B)
    userID+date() bijvoorbeeld
    nuet
  • bewerkt ma 16 mei 2016
    PMPosts: 879
    ja die date maakt het idd uniek; dat is een goeie. Heb ik gemsit dat je dat al aangaf
  • bewerkt do 2 jun 2016
    PMPosts: 879
    nog even een vraagje over 2 zaken:
    Zowel Delete als Extract voer ik uit met een GET
        if(isset($_GET['delete'])) {

    // if is directory -> remove dir
    //if(is_dir($dir.'/'.$file)){
    if(is_dir($_GET['delete'])){

    //rmdir($dir.'/'.str_replace(['/', '\\', '..'], '', $_GET['delete'])); // already protected
    removeDirectory($_GET['delete']);

    }
    // else (must be a file) -> unlink file
    else {

    //unlink($dir.'/'.str_replace(['/', '\\', '..'], '', $_GET['delete'])); // already protected
    unlink($_GET['delete']);
    //include('plugins/sfm/includes/delete.php');


    }
    $dir = dirname(($_GET['delete'])); // stel opnieuw het huidige pad in


    }
    if(isset($_GET['extract'])) {
    $zip = new ZipArchive;
    if ($zip->open($_GET['extract']) === TRUE) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
    $path_info = pathinfo($zip->getNameIndex($i));
    $ext = $path_info['extension'];

    if(in_array($ext, $AllowedExts)) { // only files with allowed Exts can be extracted
    $zip->extractTo(dirname($_GET['extract']), $zip->getNameIndex($i)); // extract in the same folder as where the zip file is
    }
    else {
    echo "Some files are not allowed to be unpacked";
    }
    }

    $zip->close();
    }


    $dir = dirname(($_GET['extract'])); // stel opnieuw het huidige pad in

    }
    Onderaan stel ik bij beiden opnieuw het pad in anders gaat ie terug naar de rootmap; want de $dir wordt uitgelezen via de url en de url staat dus op sfm?delete=..... of sfm?extract=....

    Het vervelende is nu natuurlijk dat als ik een besatnd verwijderd heb hetzelfde bestand direct erna niet kan uploaden omdat de delete van die file nog in de url staat; maw hij gooit hem er oook direct weer uit. Hoe zou ik dat kunnen oplossen zonder dat ik eerst weer op een andere map moet klikken of watdan ook?
  • header location: terug, zodra delete is uitgevoerd...je (hoort namelijk) niet thuis op een url waar niets te doen is.
  • PMPosts: 879
    ja klopt, die had ik idd ook al teruggezet. Is nu alleen jammer dat ik geen echo kan uitvoeren in de delete of extract loop door die Header Location
  • opslaan in een sessie dan (als je die info perse nodig hebt)
  • PMPosts: 732
    waarom niet in een functie ?
    hier kun je dan aangeven wat hij doet en wat hij niet doet.
    nuet
    If it's not fun, you're not doing it right!
  • bewerkt vr 3 jun 2016
    PMPosts: 415
    Dat gaat ook niet ReneV.
    Het probleem is dat hij bv een bestand verwijderd dmv de url, als je dus op "die" url zit, kan hij geen file uploaden met "die" naam.

    Nuet,
    je kan ook een header refresh gebruiken, dan kun je wel iets echoën en wordt je vanzelf omgeleid na X tijd, naar X url.
  • bewerkt vr 3 jun 2016
    PMPosts: 879
    ik heb het opgelost door ipv get post te gebruiken:
    if(isset($_POST['delete'])) {
    //protect manipulating value via browser inspector
    if(pathinfo($dir.'/'.$file, PATHINFO_DIRNAME) != pathinfo($_POST['deletefile'], PATHINFO_DIRNAME)) {
    $location = '/sfm';
    header("Location: " . "http://"; . $_SERVER['HTTP_HOST'] . $location);
    die();
    }

    // if is directory -> remove dir
    if(is_dir($_POST['deletefile'])){

    removeDirectory($_POST['deletefile']);

    }
    // else (must be a file) -> unlink file
    else {

    unlink($_POST['deletefile']);
    }
    include('plugins/sfm/includes/delete.php'); // smooth echo

    // niet meer nodig
    //$dir = dirname(($_GET['delete']));
    //header ("Location: ".'?dir='.$dir);
    //header( "refresh:5;url=?dir=".$dir );
    //die();


    }
    En dit de form:
    <form class="sfmform" method="post" action="">
    <input type="hidden" name="deletefile" value="<?php echo $dir.'/'.$file; ?>" />
    <input class="sfmdelete" type="submit" name="delete" value=" " />
    </form>
    En dit om te stylen omdat the value leeg is:
    input.sfmdelete {

    background-image: url("img/delete.png");
    background-color: transparent;
    background-repeat: no-repeat;
    background-position: center;
    border: none;
    cursor: pointer;
    }
    die header location met een delay had idd ook gekund maar dan zit je met het risico dat iemand in die tussentijd iets upload en nog steeds de echo van delete blijft hangen. ja is misschien wat overdreven maar voor mijn gevoel is dit de beste manier
Login of Registreer om te reageren.