[PHP] Veiligheid $_SERVER['PHP_SELF']

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Ik ben mij ervan bewust dat $_SERVER['PHP_SELF'] verre van veilig is, maar omdat ik die var toch vaak gebruik besloot ik een functie te schrijven die dat ding schoonmaakt. Deze functie:

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
function currentURL() {
    $file = basename($_SERVER['PHP_SELF']);
    $path = dirname($_SERVER['PHP_SELF']);
    $pathInfo = $_SERVER['PATH_INFO'];
    $url = $path . "/" . $file;
    if(!empty($pathInfo)) {
        if($pathInfo == "/") {
            $length = mb_strlen($url, 'UTF-8');
            $url[$length] = "";         
        }
        else {
            if(substr($pathInfo, -1) == "/") {
                $url .= "/";
            }
            $cleanURL = str_replace($pathInfo, "", $url, $count);
            if($count > 1) {
                $length = mb_strpos($url, $pathInfo, 0, 'UTF-8');
                $start = mb_strlen($url, 'UTF-8') - $length - mb_strlen($pathInfo, 'UTF-8');
                $workURL = mb_substr($url, -$start, $start, 'UTF-8');
                $workURL = str_replace($pathInfo, "", $workURL);
                $url = mb_substr($url, 0, $length) . $pathInfo . $workURL;
            }
            else {
                $url = $cleanURL;
            }
        }
    }
    $url = str_replace("index.php", "", $url);
    return $url;
}


Een aantal testcases:
code:
1
2
3
4
5
6
7
8
URL: /data/index.php/?xldkf=3bla?z=3/bla
Gecleand: /data/

URL: /data/index.php/data
Gecleand: /data/

URL: /data/modules/test.php/bla/data
Gecleand: /data/modules/test.php


Lijkt dus allemaal goed te gaan. Maar mijn grote vraag is nu: Zie ik niet iets over het hoofd? Is mijn functie wel veilig?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Waarom zou je die PHP_SELF willen gebruiken ipv. gewoon de daadwerkelijke url in te vullen?

Acties:
  • 0 Henk 'm!

Verwijderd

Modbreak:Ga ergens anders de kleuter uithangen met ongefundeerde opmerkingen en offtopic trolls. :/

[ Voor 89% gewijzigd door NMe op 10-05-2010 14:18 ]


Acties:
  • 0 Henk 'm!

  • WiebeV
  • Registratie: Juni 2007
  • Laatst online: 15-09 12:05
Bedankt voor deze ongefundeerde opmerking en je geweldige contributie tot dit topic. :/

[ Voor 53% gewijzigd door NMe op 10-05-2010 14:18 ]


Acties:
  • 0 Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Waar wil je `$_SERVER['PHP_SELF']` voor gebruiken?
De variable zelf doet natuurlijk geen vlieg kwaad, maar in sommige toepassingen kan het een lek veroorzaken. Misschien kan je een andere aanpak gebruiken waardoor je PHP_SELF niet eens nodig meer hebt.

Dit artikel gaat wat dieper in op het gebruik van PHP_SELF.

[ Voor 13% gewijzigd door TJHeuvel op 10-05-2010 14:17 ]

Freelance Unity3D developer


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Cartman! schreef op maandag 10 mei 2010 @ 14:02:
Waarom zou je die PHP_SELF willen gebruiken ipv. gewoon de daadwerkelijke url in te vullen?
Header redirects bijvoorbeeld.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

L0calh0st schreef op maandag 10 mei 2010 @ 14:44:
[...]


Header redirects bijvoorbeeld.
Ook (juist) daarvoor weet je toch precies wat de url gaat worden? :)

'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!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
NMe schreef op maandag 10 mei 2010 @ 14:48:
[...]

Ook (juist) daarvoor weet je toch precies wat de url gaat worden? :)
Nee hoor, ik heb een volgende document structuur:

- URL wordt opgevraagd aan de server bijv. localhost/data/modules/schedules/

index.php die zich bevindt in localhost/data/modules/schedules/index.php wordt dan dus geladen.
Deze file require_onced de core van het programma die in localhost/data/main.php staat
In die core staat de functie currentURL() (In werkelijkheid in een losse functie library, maar voor de duidelijkheid)
Die core laadt dan op basis van de configuratie van de applicatie verschillende extensies: PHP files als includes.
Waar het mij om gaat is dat die extensies soms de URL van het draaiende script nodig hebben, die url weet ik dus niet want de extensie weet niet welke pagina core.php heeft geladen. Dat kan de extensie alleen weten door de $_SERVER vars (voor zover ik weet tenminste) en vandaar dat ik die schoon wil hebben ;) Zodat ik erop kan vertrouwen in de losse extensies. Ik hoop dat ik het zo een beetje duidelijk uitgelegd heb :D

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maar los daarvan, wanneer je gaat redirecten, waarom heb je specifiek de eigen url nodig? Je weet je base url toch en waar je de user heen wilt sturen? Wat dan de huidige pagina is doet er weinig toe imo. De logica van waar je iemand naartoe stuurt die moet toch in je controller zitten en niet in een core-component?

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15-09 15:10
L0calh0st schreef op maandag 10 mei 2010 @ 14:44:
Header redirects bijvoorbeeld.
Lijkt me veel logischer daarvoor $_SERVER['REQUEST_URI'] met http_build_url te gebruiken.

Ik ben mij overigens niet bewust van een probleem met de PHP_SELF variabele. Hoe kan deze misbruikt worden? Deze wordt toch domweg door de PHP-engine gevuld met het bestand dat door Apache is aangeroepen, en zal dus altijd naar je eigen PHP-script wijzen?`

//Edit
Juist als je gaat redirecten zou je naar de REQUEST_URI moeten kijken. Dat is het pad waaronder jouw script bij de browser bekend is. Aan je lokale pad heb je dan vrij weinig, ookal komen die 2 paden op dit moment nog overeen.

[ Voor 17% gewijzigd door frickY op 10-05-2010 20:19 ]


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
frickY schreef op maandag 10 mei 2010 @ 20:15:
[...]

Lijkt me veel logischer daarvoor $_SERVER['REQUEST_URI'] met http_build_url te gebruiken.

Ik ben mij overigens niet bewust van een probleem met de PHP_SELF variabele. Hoe kan deze misbruikt worden? Deze wordt toch domweg door de PHP-engine gevuld met het bestand dat door Apache is aangeroepen, en zal dus altijd naar je eigen PHP-script wijzen?`

//Edit
Juist als je gaat redirecten zou je naar de REQUEST_URI moeten kijken. Dat is het pad waaronder jouw script bij de browser bekend is. Aan je lokale pad heb je dan vrij weinig, ookal komen die 2 paden op dit moment nog overeen.
$_SERVER['PHP_SELF'] kan heel hard misbruikt worden door XSS attacks. Zie http://www.mc2design.com/blog/php_self-safe-alternatives

Mijn script werkt ook met het pad dat bij de browser bekend is ;)

Acties:
  • 0 Henk 'm!

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 12-09 20:53
L0calh0st schreef op maandag 10 mei 2010 @ 12:51:
"..." (lap code)
Een aantal testcases:
code:
1
2
3
4
5
6
7
8
URL: /data/index.php/?xldkf=3bla?z=3/bla
Gecleand: /data/

URL: /data/index.php/data
Gecleand: /data/

URL: /data/modules/test.php/bla/data
Gecleand: /data/modules/test.php
Heb je nu niet gewoon de inhoud van $_SERVER['SCRIPT_NAME'] te pakken?

Bezoek eens een willekeurige pagina


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15-09 15:10
L0calh0st schreef op maandag 10 mei 2010 @ 20:35:
$_SERVER['PHP_SELF'] kan heel hard misbruikt worden door XSS attacks. Zie http://www.mc2design.com/blog/php_self-safe-alternatives
Dit werkt alleen als je Content Negotiation (MultiViews in Apache) gebruikt, wat sowieso geen verstandig idee is als je daar niet heel bewust mee bezig bent

Dan moet je die variabele inderdaad als unsafe user-input behandelen.

[ Voor 35% gewijzigd door frickY op 10-05-2010 23:25 ]


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
frickY schreef op maandag 10 mei 2010 @ 23:22:
[...]


Dit werkt alleen als je Content Negotiation (MultiViews in Apache) gebruikt, wat sowieso geen verstandig idee is als je daar niet heel bewust mee bezig bent

Dan moet je die variabele inderdaad als unsafe user-input behandelen.
Je hebt helemaal gelijk. Omdat ik een systeem maak dat users zelf installeren op een PHP installatie (Vergelijk het met bijv. PhpBB enz.) neem ik niets aan en check ik alles ;) Vandaar

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Heb je nog een reactie op mijn commentaar? Ik heb toch sterk het idee dat er iets in je logica niet goed gaat dat je perse PHP_SELF nodig hebt.

Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Cartman! schreef op dinsdag 11 mei 2010 @ 17:06:
Heb je nog een reactie op mijn commentaar? Ik heb toch sterk het idee dat er iets in je logica niet goed gaat dat je perse PHP_SELF nodig hebt.
Ik zelf weet de base URL wel, alleen de mensen die extensie maken niet. Bovendien, stel dat ik m'n mapstructuur ga veranderen (het is een work-in-progress op het moment) dan kan ik al m'n scripts aanpassen ;) Bovendien is het veel makkelijker om gewoon zo'n functie te gebruiken. Dus als het veilig is... Waarom niet?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Dan moet je toch echt beter nadenken over functies die je netjes de base url kunnen teruggeven zonder gebruik te hoeven maken van user input.

Niet vervelend bedoeld, maar waarom zou een ander extensies maken voor jouw projecten?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je zou hier eens kunnen kijken op regel 395 naar de functie setBaseUrl.

Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Cartman! schreef op dinsdag 11 mei 2010 @ 19:54:
Dan moet je toch echt beter nadenken over functies die je netjes de base url kunnen teruggeven zonder gebruik te hoeven maken van user input.

Niet vervelend bedoeld, maar waarom zou een ander extensies maken voor jouw projecten?
Als ik zorg dat die input mooi schoon is het toch ook prima?

Omdat ik in een projectteam zit en ik verantwoordelijk ben voor de core?

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Maar als er dus een heel team afhankelijk van jou is, waarom gebruik je geen robuust framework waar door anderen aan gewerkt wordt die dat veel beter kunnen dan jij? (niet dat ik het wel kan, maar ik wil het niet eens meer)

Ik zou die base url lekker in een config of bootstrap plaatsen, dan hoef je t nooit meer te valideren en heb je het gewoon in een registry of vanuit een define beschikbaar.
Pagina: 1