login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Paginasysteem - Veilig?

Offline Sar - 04/07/2007 01:41 (laatste wijziging 04/07/2007 01:42)
Avatar van SarPHP interesse Hey,

Ik heb een simpel paginasysteem voor mijn site:

  1. <?php
  2. if(empty($_GET['p']))
  3. {
  4. include 'home.php';
  5. }
  6. elseif(file_exists($_GET['p']))
  7. {
  8. include $_GET['p'];
  9. }
  10. else
  11. {
  12. include 'error.php';
  13. }
  14. ?>


Is dit veilig? Zo nee, waarom niet?

14 antwoorden

Gesponsorde links
Offline Stijn - 04/07/2007 02:15
Avatar van Stijn PHP expert onveilig want als ik ?p=http://www.mijnsite.be/gevaarlijk_bestand.php doe dan wordt dit bestand ook geinclude.
Offline Ultimatum - 04/07/2007 04:36
Avatar van Ultimatum PHP expert @stijn, daar heb ik dan even een vraag over . Er word toch met file_exists() gecontroleerd of het bestand bestaat toch?
Offline marten - 04/07/2007 08:35
Avatar van marten Beheerder En als je nou index.php meegeeft? Zal hij de index.php includen zodat je een oneindige loop krijgt.
Offline Sar - 04/07/2007 10:39 (laatste wijziging 04/07/2007 10:39)
Avatar van Sar PHP interesse @stijn: Dit kan inderdaad niet, als de file niet bestaat op mijn ftp geeft hij een foutmelding!

@marten: Ja, dat klopt, niet aangedacht!

Heb het nu eerst zo:
  1. <?php
  2. if(empty($_GET['p']))
  3. {
  4. include 'home.php';
  5. }
  6. elseif($_GET['p'] == 'index.php')
  7. {
  8. echo "Beveiliging!";
  9. }
  10. elseif(file_exists($_GET['p']))
  11. {
  12. include $_GET['p'];
  13. }
  14. else
  15. {
  16. echo $error;
  17. echo $back;
  18. }
  19. ?>
Offline marten - 04/07/2007 10:42
Avatar van marten Beheerder je kan beter met een regex erin doen. want als ik nu index.php?blaaaa doe dan vang je hem niet op en heb je toch de index include Dus kan je beter een regex uitvoeren of er index.php in voor komt.
Offline BramBo - 04/07/2007 11:17
Avatar van BramBo JS gevorderde waarom niet voor definiëren welke files je hebt in een array en op basis van je array een keuze maken ?

dus
  1. $paginas = new Array('home','blaat','jan','kees');
  2.  
  3. if(empty($_GET['p'])) {
  4. include('home.php');
  5. } else {
  6. if(in_array($_GET['p'], $paginas)) {
  7. include($_GET[''p].'.php');
  8. } else {
  9. include('error.php');
  10. }
  11. }
Offline ikkedikke - 04/07/2007 13:32
Avatar van ikkedikke PHP expert Als ik jou was zou ik alle scripts die geinclude mogen worden in 1 map stoppen en dan iets als dit gebruiken om te checken of alles uit die map gehaald wordt.
zo heb je ook niet het probleem dat configuratiebestanden ed opgehaald kunnen worden.
Offline ArndJan - 04/07/2007 16:07
Avatar van ArndJan PHP interesse Als ik jou was zou ik....

dat niet doen omdat je daarmee te veel geheugen gebruikt. En als het niet klopt is het een fout in je script. Je moet natuurlijk wel de mogelijke aanvallen van buiten af weren.

Je moet er vanuit gaan dat de bestanden op de server staan. Dus geen controlles meer zoals is_file() etc...

en dan de code van BramBo gebruiken en dit:



  1. include($_GET[''p].'.php');
veranderen in:
  1. include($_GET['p'].'.php');
dit

^^
Offline Koen - 04/07/2007 16:11 (laatste wijziging 04/07/2007 16:12)
Avatar van Koen PHP expert Wat zijn jullie toch aan het knoeien 
Je kan toch evengoed zo controleren welke pagina:
  1. <?
  2. switch($_GET['p']) {
  3. case 'home.php':
  4. include 'home.php';
  5. break;
  6. case 'babla.php':
  7. include 'babla.php';
  8. break;
  9. // en zo verder.. tot:
  10. default:
  11. include 'home.php';
  12. }
  13. ?>

[URL=http://php.net/switch]PHP.NET: Switch();[/URL]
*edit:*
' vergeten 
Offline Ultimatum - 04/07/2007 16:16
Avatar van Ultimatum PHP expert @sliphead, dat is precies hetzelfde als in een array zetten, alleen in een array zetten is overzichtelijker/makkelijker
Offline Sar - 04/07/2007 17:47 (laatste wijziging 04/07/2007 18:00)
Avatar van Sar PHP interesse Ik zat te denken aan:

  1. <?php
  2. switch($_GET['p']) {
  3. case 'home':
  4. case 'babla':
  5. case 'test':
  6. case 'blaat':
  7. include $_GET['p'].".php";
  8. break;
  9. default:
  10. include 'home';
  11. break;
  12. }
  13. ?>


Maar hoe kan ik de error pagina nou weergeven als hij niet bestaat?

Edit: Dacht mischien met case NULL: maar dat werkt ook niet!
Offline BramBo - 04/07/2007 18:41
Avatar van BramBo JS gevorderde Gebruik gewoon de code die ik eerder heb gegeven en alles zou prima moeten werken. Wanneer je de switch gebruikt wordt de default case getriggert zowel op een lege _GET['p'] als op een foutieve..
Offline ikkedikke - 04/07/2007 19:06
Avatar van ikkedikke PHP expert Het nadeel hiervan is dat je voor iedere pagina je script aan moet passen.
Offline BramBo - 04/07/2007 22:11
Avatar van BramBo JS gevorderde yup, maar helaas zitten overal nadelen aan. Een file includen via een switch kent beperkte controle mogelijkheden. Een file includen via de naam in de get is weer te complex..
Deze dien je dan op allerlei factoren te controleren. (bestaat ja/nee? niet te hoog in directories ja/nee? goede file extentie ja/nee? etc..)
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.298s