Vraag & Antwoord

Webprogrammeren & scripting

[PHP] Directory pagina's uitlezen

18 antwoorden
  • Hoi allemaal, Ik zit met het volgende. Ik heb een map 'content' met daarin al mijn pagina's: home.php, contact.php, nieuws.php, etc. etc. Deze pagina's worden ge'include. Dus als je de homepage wilt zien, moet je op de volgende URL wezen: http://www.mijnsite.nl/index.php?pagina=home En de contactpagina wordt zo opgeroepen: http://www.mijnsite.nl/index.php?pagina=contact Nu heb ik ook een balk op de site die afhankelijk van de geladen pagina moet worden weergegeven. Dat script ziet er zo uit: [code:1:eae5c6f484]<?php if (isset($_GET['pagina']) && !empty($_GET['pagina'])) { $pagina = $_GET['pagina']; echo("<img src=\"Images/$pagina.gif\" width=\"500\" height=\"25\">"); } else { echo('<img src="Images/error.gif" width="500" height="25">'); } ?>[/code:1:eae5c6f484] Echter, als nu bijvoorbeeld de volgende pagina wordt opgeroepen: http://www.mijnsite.nl/index.php?pagina=pietjepuk Dan wordt door het script geprobeerd 'pietjepuk.gif' te laden. Deze afbeelding bestaat echter niet. Dit wil ik voorkomen. Nu kan ik natuurlijk wel een IF-lus erin gooien met: 'Als pagina = contact of pagina = home of pagina = nieuws, dan moet de afbeelding worden geladen en zoneit, dan niet.' Maar als ik straks meer dan 50 pagina's heb, wordt dat een beetje vervelend. Ik wil dus het volgende: Als er een pagina wordt opgeroepen die voorkomt in de map 'content' (waar al mijn pagina's in staan) dan moet deze pagina worden ge'include en de bijbehorden pagina getoond. Als er een pagina wordt opgeroepen die niet in de map 'content' staat, moet de error.php en error.gif worden geladen. Kortom: de directory moet worden uitgelezen, maar hoe doe ik dit? Op [url=http://www.google.nl/search?hl=nl&q=PHP+directory+uitlezen&meta=]Google[/url] kwam ik zelf niet verder. Wie wel? Alvast onwijs bedankt!
  • Het is sowieso niet erg slim dergelijke variabelen ongecontroleerd te gebruiken om bestanden op te roepen. Een aardige beveiliging, die meteen je probleem op kan lossen, is het in een array onderbrengen van de diverse data.
  • Of is_file() gebruiken
  • Bedankt voor beide reacties.[quote:79e4f3c57c="gerben"]Het is sowieso niet erg slim dergelijke variabelen ongecontroleerd te gebruiken om bestanden op te roepen. Een aardige beveiliging, die meteen je probleem op kan lossen, is het in een array onderbrengen van de diverse data.[/quote:79e4f3c57c] Is het dan mogelijk om het zo te doen: (ff in mensentaal) [code:1:79e4f3c57c] Maak een array met alle bestanden in een bepaalde directory If $pagina is één van de variabelen van de array { include $pagina } Else { include $error } [/code:1:79e4f3c57c] Zoja, hoe? Zoniet, hoe wel? Alvast bedankt :)
  • Je kunt kijken of een bepaalde variabele in die array gedefiniëerd is. Zoja, geef bjivoorbeeld de pagina weer. Zoniet, geef de foutmelding (of een default pagina).
  • Ik zou het eerder zoiets doen: [code:1:f15bc6103e] $errorImage = 'error.gif'; $dir = 'images/'; // leeg laten als het in de dir is waar je de pagina laad. $imgPath = $dir . $errorPath; if ( !empty($_GET['pagina']) ) { if ( is_file($dir . $_GET['pagina'] . '.gif') ) { $imgPath = $dir . $_GET['pagina'] . '.gif'; } } echo '<img src="' . $imgPath . '" width="500" height="25">[/code:1:f15bc6103e]
  • Is ook een optie. Maar je zult toch altijd die variabele "pagina" moeten checken. Ongecontroleerd variabelen gebruiken om bestanden op te roepen, is vragen om problemen.
  • Is mijn optie zie ik zo direct niet het gevaar. Ik check alleen of de file bestaat, include niets en geef alleen een path terug. Mis ik iets?
  • En als je nu voor pagina /etc/passwd invult?
  • krijg je <img src="images/error.gif" width="500" height="25"> aangezien images//etc/passwd.gif niet bestaat. Spannend?
  • Allebei bedankt voor het meedenken (en scripten)! Ik ga er gelijk mee aan de slag! Jullie horen wel of het gelukt is (of niet)!
  • Het werkt als een trein! Bedankt Arno! Gerben, jij uiteraard ook bedankt voor het meedenken! Alleen, vraag ik me nog wel af of dit script wel veilig is. Mij lijkt van wel, maar ik ben dan ook een leek. Ik hoor het wel!
  • In dit geval wel. Maar het mantra voor elke programmeur is: "never trust user input". Of zou dat moeten zijn in ieder geval. Je moet gewoon altijd checken wat er ingevoerd wordt, en zorgen dat er niet iets anders kan gebeuren, dan wat jouw bedoeling is. Zeker als je bestanden gaat opvragen middels includes etc. Een array is en vrij simpele en trefzekere manier om een dergelijke check uit te voeren.
  • Dit treft wel een interessante discussie, hoe include je dus iets veilig naar uw manier? Persoonlijk zou ik het zoiets doen, wat voor manier zou dit onveilig kunnen zijn? [code:1:9ef4318ddf] <? $strInput = FALSE; $strIncludePath = 'includes/'; if ( !empty($_GET['page']) ) { $strInput = $_GET['page']; } if ( !empty($strInput) ) { if ( is_file($strIncludePath . $strInput . '.php') ) { include($strIncludePath . $strInput . '.php'); } } ?> [/code:1:9ef4318ddf]
  • Voor page kun je hier vanalles invullen. Je kunt bijvoorbeeld een directory omhoog: "../blabla", "../../blibli". En daardoor willekeurige andere php bestanden opvragen. Je kunt een spatie in de naam zetten, en daarmee mogelijk ook andere bestanden opvragen: "/etc/passwd blibli". En meer van dergelijke trucs. Je zou in deze code een simpele check kunnen inbouwen. Je kunt met een regex alleen letters en/of cijfers toestaan.
  • Gerben en Arno, bedankt voor het meedenken. Ik denk dat ik met deze info zelf wel aan de slag kan gaan zodat de boel niet alleen werkt, maar ook nog veilig wordt!
  • Zodra je iets af laat hangen van een user input zou ik meteen met een switch gaan werken: http://nl3.php.net/switch
  • [quote:bbf084b7e6="teacher"]Zodra je iets af laat hangen van een user input zou ik meteen met een switch gaan werken: http://nl3.php.net/switch[/quote:bbf084b7e6]Bedankt teacher, dit gaat zeker van pas komen!!! :)

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.