[php] mijn manier van paginas includen in index.php veilig?

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Ik wil dat index.php altijd wordt aangeroepen, en aan de hand van een get variabele of session variabele de juiste pagina wordt geinclude.

Er is een publiek gedeelte, daarnaast 4 verschillende gedeeltes voor 4 verschillende rollen.
Als iemand inlogt dan wordt $_SESSION['section'] geset. Dan wordt gekeken of er in de map met de naam $_SESSION['section'] een bestand aanwezig is met de naam $_GET['page'].

Ik heb gegoogled op manieren waarop ik dit kan doen, en wat de veiligheid is, maar ik mis even het overzicht of wat ik gemaakt heb echt veilig is. Moet ik hier bijvoorbeeld de user input converteren met htmlentities ofzoiets? Graag een voorbeeldje dan wat het probleem kan zijn.

De code van index.php :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
session_start();

// de root definieren
define("ROOT","D:/Mijn server/xampp/htdocs/private/kvk/");
// einde definieren root constant


function checkPage($sectie)
{
    $filename = $sectie .'/'. $_GET['page'];
    
    if (!ctype_alnum($_GET['page']))
    {
        $page = 'error.php'; 
    }
    
    elseif (!file_exists(ROOT."_pages/". $filename))
    {
        $page = 'error.php';       
    }
    else
    {
        $page = $_GET['page'] . '.php'; 
    }
    
return $page;   
}


// kijk in welke map er gekeken moet worden
(isset($_SESSION['section'])? ($sectie = $_SESSION['section']) : ($sectie = 'publiek'));

// kijk welk bestand uit die map geinclude moet worden
(isset($_GET['page'])? ($page = checkPage($sectie)) : ($page = 'home.php'));

include(ROOT .'_pages/'. $sectie .'/'. $page);



?>

[ Voor 21% gewijzigd door dossiewossie op 20-09-2005 15:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat als $page nu ../../../../etc/passwd ofzoiets is (ik weet alleen van toepassing op *nix bakken) dan laat hij die file zien. Vandaar dat je op dit soort constructies moet testen. Bij php.net vind je hier ook dingen over.

Acties:
  • 0 Henk 'm!

Verwijderd

Kan je niet beter andersom werken, en juist de afzonderlijke pagina's gebruiken, en zaken die altijd moeten verschijnen / gebeuren includen vanaf die pagina's?

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Je hebt gelijk, dat zal ik moeten afvangen.

Ik kijk nog even verder op php.net

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Verwijderd schreef op dinsdag 20 september 2005 @ 14:09:
Kan je niet beter andersom werken, en juist de afzonderlijke pagina's gebruiken, en zaken die altijd moeten verschijnen / gebeuren includen vanaf die pagina's?
In de geinclude paginas worden ook weer bepaalde standaard delen geinclude.

Voor mijzelf vindt ik deze manier van werken iets overzichtelijker

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

dossiewossie schreef op dinsdag 20 september 2005 @ 14:09:
Je hebt gelijk, dat zal ik moeten afvangen.

Ik kijk nog even verder op php.net
Wat je het beste kan doen is testen (met een regex ofzo) of die string alleen bijvoorbeeld a-z en 0-9 bevat en geen andere tekens als . en / etc.
Verwijderd schreef op dinsdag 20 september 2005 @ 14:09:
Kan je niet beter andersom werken, en juist de afzonderlijke pagina's gebruiken, en zaken die altijd moeten verschijnen / gebeuren includen vanaf die pagina's?
dan heb je niet een handig overzicht + extra werk als er een nieuwe pagina bijkomt.
Overigens is een groot voordeel van deze manier dat je met een eenvoudige mod_rewrite rule mooie URL's kan krijgen.

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
/etc/passwd krijg je niet te zien aangezien er .php wordt toegevoegd aan $page. Dat neemt niet weg dat op deze wijze in principe elke .php file op de server ingelezen kan worden. Met een beetje giswerk kan iederen nu dus bij je "beveiligde" pagina's.
Een beter methode is om alleen pagina's te includen die je ergens zelf definieert. Dat kan in een array of je database, net om hoeveel pagina's het gaat.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Erkens schreef op dinsdag 20 september 2005 @ 14:11:
[...]

Wat je het beste kan doen is testen (met een regex ofzo) of die string alleen bijvoorbeeld a-z en 0-9 bevat en geen andere tekens als . en / etc.


[...]

dan heb je niet een handig overzicht + extra werk als er een nieuwe pagina bijkomt.
Overigens is een groot voordeel van deze manier dat je met een eenvoudige mod_rewrite rule mooie URL's kan krijgen.
Kijk daar zat ik net aan te denken, dankjewel

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
T-MOB schreef op dinsdag 20 september 2005 @ 14:14:
/etc/passwd krijg je niet te zien aangezien er .php wordt toegevoegd aan $page. Dat neemt niet weg dat op deze wijze in principe elke .php file op de server ingelezen kan worden. Met een beetje giswerk kan iederen nu dus bij je "beveiligde" pagina's.
Een beter methode is om alleen pagina's te includen die je ergens zelf definieert. Dat kan in een array of je database, net om hoeveel pagina's het gaat.
Vergis je je niet? Ik heb het net geprobeerd, en dat schijnt echt niet te lukken hoor.

Kijk je niet over $sectie heen? Daar heeft de gebruiker geen invloed op.

Denk ik.......

:)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

T-MOB schreef op dinsdag 20 september 2005 @ 14:14:
/etc/passwd krijg je niet te zien aangezien er .php wordt toegevoegd aan $page.
Nou, ik weet het niet. Ik weet niet helemaal hoe include in elkaar zit, maar als het lijkt op de filesystem functies van Linux/UNIX zelf, dan kun je misschien wel een pipe-teken invoeren. .php erachter zetten zou in dat geval niets uithalen, en is nog steeds onveilig, maar of het echt zo werkt weet ik niet zeker. :)
Een beter methode is om alleen pagina's te includen die je ergens zelf definieert. Dat kan in een array of je database, net om hoeveel pagina's het gaat.
Inderdaad, sterker nog, AFAIK is dat de enige echt veilige manier: alle mogelijke opties in een array zetten, en kijken of de binnengekomen waarde in dat array zit. Zo niet: indexpagina weergeven. Zo ja: de opgevraagde pagina.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function checkPage($sectie)
{
    if (ctype_alnum($_GET['page']) {
        $filename = $sectie .'/'. $_GET['page'];
    }
    else {
        die('Doei!');
    }

    if (!file_exists(__ROOT__ ."_pages/". $filename))
    {
        $page = 'error.php';       
    }
    else
    {
        $page = $page .'.php';    
    }
    
return $page;    
}

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
-NMe- schreef op dinsdag 20 september 2005 @ 14:20:
[...]

Nou, ik weet het niet. Ik weet niet helemaal hoe include in elkaar zit, maar als het lijkt op de filesystem functies van Linux/UNIX zelf, dan kun je misschien wel een pipe-teken invoeren. .php erachter zetten zou in dat geval niets uithalen, en is nog steeds onveilig, maar of het echt zo werkt weet ik niet zeker. :)

[...]

Inderdaad, sterker nog, AFAIK is dat de enige echt veilige manier: alle mogelijke opties in een array zetten, en kijken of de binnengekomen waarde in dat array zit. Zo niet: indexpagina weergeven. Zo ja: de opgevraagde pagina.
Als het echt niet kan, dan zal ik dat doen. Maar liever niet als het niet nodig is. Kan iemand nog een voorbeeldje geven waarom dit gevaarlijk zou zijn?

Ik kan natuurlijk ook de mappen in pages uitlezen, en voor elke map een array van alle paginas maken, Dat is ook nog wel flexibel.

Is dat een beter id?

Acties:
  • 0 Henk 'm!

Verwijderd

grote kans dat je dus iets kan doen als "../../../porno.jpg; een_php_bestand"

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Skaah schreef op dinsdag 20 september 2005 @ 14:23:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function checkPage($sectie)
{
    if (ctype_alnum($_GET['page']) {
        $filename = $sectie .'/'. $_GET['page'];
    }
    else {
        die('Doei!');
    }

    if (!file_exists(__ROOT__ ."_pages/". $filename))
    {
        $page = 'error.php';       
    }
    else
    {
        $page = $page .'.php';    
    }
    
return $page;    
}
Ah, gewoon een php functie hiervoor :)

Prettig, regex vindt ik altijd beetje onoverzichtelijk.

Dit zal ik er in ieder geval ook ingooien, bedankt.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

ene kant
template:
code:
1
2
3
START
include iets
EIND

iets
code:
1
2
voorbereidend werk
helecontent

andere kant
iets
code:
1
2
3
4
voorbereidend werk
include START
hele content
include EIND

met uiteraard de bestanden START en EIND
dan heb je niet een handig overzicht
Waarom niet, het overzicht blijft exact hetzelfde. ipv 1 index.php is er nu een header.php en footer.php.
+ extra werk als er een nieuwe pagina bijkomt.
Het bestand dat je normaal include heeft inderdaad 2 regeltjes extra. Je template is echter compleet verschoont van include checks aangezien er nergens een pagina op basis van userinput geinclude moet worden. Daarnaast zijn fouten die in je de in jouw geval geinclude content optreden lastig af te handelen aangezien je header al verstuurt is door je index.php (tenzij je dat weer met ob_start ed afvangt)
Overigens is een groot voordeel van deze manier dat je met een eenvoudige mod_rewrite rule mooie URL's kan krijgen.
Bij de oplossing waarbij je je template include heb je al mooie URL's en hoef je die niet te simuleren met mod_rewrites.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Of doe het geheel andersom maak aparte pagina's en include de index:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?//Dynamically find the config file and calculate the relative path for the config file
if (!defined('REL')) {  
  $rel                          = '';
  $REL_CONFIG_FILE  = 'config.inc.php';
  $REL_DEPTH            = 0;
  $REL_MAX_DEPTH        = 10;
  $REL_FOUND                = file_exists($rel.$REL_CONFIG_FILE);
    while (!$REL_FOUND && $REL_DEPTH < $REL_MAX_DEPTH) {
      $REL_DEPTH++;
        $rel.="../";
        $REL_FOUND = file_exists($rel.$REL_CONFIG_FILE);
    }
    if($REL_FOUND === true) {
        require_once($rel.$REL_CONFIG_FILE);
        unset($rel,$REL_DEPTH,$REL_MAX_DEPTH,$REL_FOUND);
    } else {
      //The config file could not be found. The page cannot bedisplayed
        die('FATAL : '.$REL_CONFIG_FILE.' not found');  
    }
} 
require_once(REL.'-inc-/pageGui.inc.php');              //Displaying functions ?>

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ik pak dit simpel gezegd altijd zo aan.

PHP:
1
2
3
4
5
6
7
8
$pages = array('index','page','fotoalbum');

if(in_array($_GET['page'], $pages))
{
     include($_GET['page']);
}
else
     echo "Pagina bestaat niet";

[ Voor 18% gewijzigd door Brakkie op 20-09-2005 14:42 ]

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Die checkPage functie klopt sowieso niet helemaal volgens mij. Bij de laatste else staat nameljik dit:
PHP:
1
$page = $page . ".php";

terwijl $page helemaal geen waarde heeft gekregen eerder in de functie. Het is ook geen global, want ik zie er geen declaratie voor. Je kunt trouwens ook gemakkelijk met guard clauses werken. Dus:
PHP:
1
2
3
4
5
6
  return 'error.php';
}
else
{
  return $page . '.php';
}

En dan die laatste return weglaten. Scheelt je weer een overbodige regel.

[ Voor 5% gewijzigd door Michali op 20-09-2005 14:54 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
vgouw schreef op dinsdag 20 september 2005 @ 14:42:
Of doe het geheel andersom maak aparte pagina's en include de index:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?//Dynamically find the config file and calculate the relative path for the config file
if (!defined('REL')) {  
  $rel                          = '';
  $REL_CONFIG_FILE  = 'config.inc.php';
  $REL_DEPTH            = 0;
  $REL_MAX_DEPTH        = 10;
  $REL_FOUND                = file_exists($rel.$REL_CONFIG_FILE);
    while (!$REL_FOUND && $REL_DEPTH < $REL_MAX_DEPTH) {
      $REL_DEPTH++;
        $rel.="../";
        $REL_FOUND = file_exists($rel.$REL_CONFIG_FILE);
    }
    if($REL_FOUND === true) {
        require_once($rel.$REL_CONFIG_FILE);
        unset($rel,$REL_DEPTH,$REL_MAX_DEPTH,$REL_FOUND);
    } else {
      //The config file could not be found. The page cannot bedisplayed
        die('FATAL : '.$REL_CONFIG_FILE.' not found');  
    }
} 
require_once(REL.'-inc-/pageGui.inc.php');              //Displaying functions ?>
hmmm, dat zou misschien makkelijker werken jah, maar ik zie niet snel genoeg wat het doet. Ik ben alleszins geen php guru, ik hou het liever bij code die ik in een oogopslag snap. :P

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Michali schreef op dinsdag 20 september 2005 @ 14:54:
Die checkPage functie klopt sowieso niet helemaal volgens mij. Bij de laatste else staat nameljik dit:
PHP:
1
$page = $page . ".php";

terwijl $page helemaal geen waarde heeft gekregen eerder in de functie. Het is ook geen global, want ik zie er geen declaratie voor. Je kunt trouwens ook gemakkelijk met guard clauses werken. Dus:
PHP:
1
2
3
4
5
6
  return 'error.php';
}
else
{
  return $page . '.php';
}

En dan die laatste return weglaten. Scheelt je weer een overbodige regel.
Ja, was ff een foutje denk ik. Heb ik altijd als ik chaotisch loop te klooten 8)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
-NMe- schreef op dinsdag 20 september 2005 @ 14:20:
[...]
Nou, ik weet het niet. Ik weet niet helemaal hoe include in elkaar zit, maar als het lijkt op de filesystem functies van Linux/UNIX zelf, dan kun je misschien wel een pipe-teken invoeren. .php erachter zetten zou in dat geval niets uithalen, en is nog steeds onveilig, maar of het echt zo werkt weet ik niet zeker. :)
code:
1
Warning: main(index.php | .php): failed to open stream: No such file or directory in /var/www/test.php on line 3
dossiewossie schreef op dinsdag 20 september 2005 @ 14:18:
Vergis je je niet? Ik heb het net geprobeerd, en dat schijnt echt niet te lukken hoor.

Kijk je niet over $sectie heen? Daar heeft de gebruiker geen invloed op.
Toen ik dat schreef stond er nog geen ctype_alnum() in je code. Dan had je dus als pagina "../een_gegokte_section/page" kunnen opgeven

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
dossiewossie schreef op dinsdag 20 september 2005 @ 15:12:
[...]hmmm, dat zou misschien makkelijker werken jah, maar ik zie niet snel genoeg wat het doet. Ik ben alleszins geen php guru, ik hou het liever bij code die ik in een oogopslag snap. :P
Daar hebben ze commentaar voor uitgevonden.
Het zoekt naar "config.inc.php" file in de onderliggende directory en dat maximaal 10 niveaus diep.
Daarna vult hij de variable REL met het reletive path naar die config.inc.php

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 00:18
vgouw schreef op dinsdag 20 september 2005 @ 14:42:
Of doe het geheel andersom maak aparte pagina's en include de index:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?//Dynamically find the config file and calculate the relative path for the config file
if (!defined('REL')) {  
  $rel                          = '';
  $REL_CONFIG_FILE  = 'config.inc.php';
  $REL_DEPTH            = 0;
  $REL_MAX_DEPTH        = 10;
  $REL_FOUND                = file_exists($rel.$REL_CONFIG_FILE);
    while (!$REL_FOUND && $REL_DEPTH < $REL_MAX_DEPTH) {
      $REL_DEPTH++;
        $rel.="../";
        $REL_FOUND = file_exists($rel.$REL_CONFIG_FILE);
    }
    if($REL_FOUND === true) {
        require_once($rel.$REL_CONFIG_FILE);
        unset($rel,$REL_DEPTH,$REL_MAX_DEPTH,$REL_FOUND);
    } else {
      //The config file could not be found. The page cannot bedisplayed
        die('FATAL : '.$REL_CONFIG_FILE.' not found');  
    }
} 
require_once(REL.'-inc-/pageGui.inc.php');              //Displaying functions ?>
jeetje, dat is omslachtig, zoveel onnodige code.... echt sneller/overzichtelijker wordt je code er ook niet van :X

|>


Acties:
  • 0 Henk 'm!

  • vinnux
  • Registratie: Maart 2001
  • Niet online
Maar wel heeeeeeeeel erg makkelijk, ik kan zo hele directories verplaatsen hernoemen etc zonder één klein probleem. En het moest veilig toch .. nou dit was de veiligste oplossing. Gebruik het al jaren op kleine en groote sites en nog nooit problemen mee gehad.
En op deze manier kan ik ook meerdere sites op één site zetten.

Tevens kan ik op deze manier ook meerdere config files gebruiken die bepaalde waardes overschrijft in config file in de root bijvoorbeeld.

[ Voor 18% gewijzigd door vinnux op 20-09-2005 15:26 ]


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
T-MOB schreef op dinsdag 20 september 2005 @ 15:17:
[...]

code:
1
Warning: main(index.php | .php): failed to open stream: No such file or directory in /var/www/test.php on line 3



[...]


Toen ik dat schreef stond er nog geen ctype_alnum() in je code. Dan had je dus als pagina "../een_gegokte_section/page" kunnen opgeven
Jeps, dat snap ik, maar voordat ik het erbij had gezet heb ik het getest, en toen werkte het ook niet. Misschien omdat ik op een windows machine test, anders weet ik het ook niet :)

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op dinsdag 20 september 2005 @ 14:20:
Inderdaad, sterker nog, AFAIK is dat de enige echt veilige manier: alle mogelijke opties in een array zetten, en kijken of de binnengekomen waarde in dat array zit. Zo niet: indexpagina weergeven. Zo ja: de opgevraagde pagina.
onzin, als je checked op chars in die string dat ze alleen a-z en 0-9 etc mogen zijn en dan kijken of die file exists ben je net zo veiliger, met als grote pluspunt dat je gewoon een file kan toevoegen zonder iets te editen en het werkt ;)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Overigens, waarom gebruik je die __ __ in je constante? Je weet dat die doorgaans gebruikt worden voor "magic constants"?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
Grijze Vos schreef op dinsdag 20 september 2005 @ 15:44:
Overigens, waarom gebruik je die __ __ in je constante? Je weet dat die doorgaans gebruikt worden voor "magic constants"?
En verandert :)

Ik als beginnende phper weet een beetje maar bij lange na niet alles, even gechecked op php.net, en inderdaad, dit wordt voor magic constants gebruikt. Nu is het weer wat netter.

thnx

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
-NMe- schreef op dinsdag 20 september 2005 @ 14:20:
[...]

Nou, ik weet het niet. Ik weet niet helemaal hoe include in elkaar zit, maar als het lijkt op de filesystem functies van Linux/UNIX zelf, dan kun je misschien wel een pipe-teken invoeren. .php erachter zetten zou in dat geval niets uithalen, en is nog steeds onveilig, maar of het echt zo werkt weet ik niet zeker. :)
Null character (%00 urlencoded) toevoegen aan het eind van de parameter heeft ook zijn nut. Alleen zal de check die uitgevoerd word door ctype_alphanum struikelen over de / in je string.

Acties:
  • 0 Henk 'm!

  • dossiewossie
  • Registratie: Maart 2004
  • Laatst online: 06-09 18:33
PrisonerOfPain schreef op dinsdag 20 september 2005 @ 16:44:
[...]

Null character (%00 urlencoded) toevoegen aan het eind van de parameter heeft ook zijn nut. Alleen zal de check die uitgevoerd word door ctype_alphanum struikelen over de / in je string.
Bedoel je mijn string? Alleen de $_GET['page'] wordt gechecked hoor, niet het hele pad

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
dossiewossie schreef op dinsdag 20 september 2005 @ 16:49:
[...]


Bedoel je mijn string? Alleen de $_GET['page'] wordt gechecked hoor, niet het hele pad
pagina.php?page=/etc/passwd%00 zal een error.php opleveren enkel en alleen vanwegen de / in het pad. Als die er niet zou zijn, en ik bijvoorbeeld geinteresseerd zou zijn in miep (zonder .php, dan zou ctype_alphanum namelijk over de . struikelen) zou ik pagina aanroepen met pagina.php?page=miep%00 in dat geval word miep, en niet miep.php geinclude vanwege de manier waarop PHP met strings werkt. (Namelijk, een \0 of null byte of %00 in het geval van urlencoding allemaal hetzelfde ;), geeft het einde van een string aan.) Zie bijvoorbeeld ook http://bugs.php.net/bug.php?id=30489.

Toch maar even getest, blijkt dat ctype_alphanum ook over \0 struikelt, hier tenminste.

[ Voor 8% gewijzigd door PrisonerOfPain op 20-09-2005 17:05 ]


  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
dossiewossie schreef op dinsdag 20 september 2005 @ 14:27:
[...]
Ah, gewoon een php functie hiervoor :)
Prettig, regex vindt ik altijd beetje onoverzichtelijk.
Dit zal ik er in ieder geval ook ingooien, bedankt.
Onoverzichtelijk?
PHP:
1
preg_match("^[A-z0-9]+$",$string);

Valt wel mee toch? Alleen is ctype_alnum() (1000x ofzo) sneller.

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Inderdaad, maargoed, de regel dat wat men niet beheerst, is onduidelijk, is vaak de reden. Overigens kunnen named sets al een hoop verduidelijken aan je regexp, en kun je ook daarin commentaar gebruiken en nette indenting gebruiken. Dus dat zal het probleem dan ook weer niet hoeven zijn. Wat ik onoverzichtelijk vind, is het gebruik van vijfentwintig PHP functies om hetzelfde te doen als een regular expression.

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Je kan nu trouwens nog steeds lege pagina's includen of een fout oproepen door geen GET variabele aan de URL mee te geven.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1