Schaake.nu

Path Info

Gepost in /PHP ontwikkeling/Software op 15 Oktober 2012
Deze blog is geschreven door Christiaan Schaake

Path Info

Path Info is een methode om URL parameters mee te geven aan een webpagina in de URL. Dus i.p.v. /mydir/script.php?parameter=value kan de URL worden aangeroepen als /mydir/script/value. Het feitelijke script bevindt zich op /mydir/script (zonder de extentie). Er zijn een 2-tal redenen om deze techniek te gebruiken.

  • Veiligheid
  • REST

Veiligheid

Alle webservers hebben veiligheid lekken, zowel bekende als (nog) onbekende. Echter worden veiligheids lekken ook regelmatig gedicht. Lekken zijn dus maar een beperkte tijd beschikbaar, of eigenlijk voor een bepaalde versie van de software. Het is dus voor iemand die een lek wil gebruiken, om in een site in te breken, te weten welke software de site gebruikt. Een nadeel van PHP Is het feit dat dit vaak te herkennen is aan de extentie van de scripts. Het zou mooi zijn als we niet hoeven aan te geven welke script-taal we gebruiken door de extentie volledig weg te halen. Met de beschrijving in deze blog kan dit nu.

REST

REST is een architectuur model waarbij data rechtstreeks wordt benaderd. REST is de afkorting voor Representational State Transfer en betekend dat resources rechtstreeks benaderd en/of gemanipuleerd kunnen worden.
Zo kan een lijst contacten opgevraagd worden door /contacts en een specifiek contact persoon door /contacts/jones. In traditioneel PHP zou er of voor elke contact persoon een eigen script moeten bestaan, of er een parameter met daarin de contact persoon meegegeven moeten worden (/contacts.php?name=jones).
Met de oplossing in deze blog komt REST weer een stapje dichterbij.

Apache configuratie

De eerste stap is om in de apache webserver de optie PathInfo aan te zetten. Dit gebeurd via de parameter AcceptPathInfo. De volgende stap is om de apache webserver te vertellen dat alle onbekende bestanden (dus zonder extentie) gezien moeten worden als php scripts.
Voeg hiervoor de volgende regels toe aan /etc/apache2/httpd.conf

AddType application/x-httpd-php .php .html
AcceptPathInfo onbekende
DefaultType application/x-httpd-php
ForceType application/x-httpd-php

Hierna wordt elke onbekende extentie gezien als php script.

PathInfo in PHP

Normaal worden URL parameters doorgeven in de parameter $_SERVER['GET'], echter zijn de extra URL segmenten niet zichtbaar als GET parameters. GET parameters zijn echter nog steeds te gebruiken. En zeer handig als extra parameter zoals posities in een lijst.
PHP heeft echter een speciale server parameter welke de Patch Info doorgeeft. Deze parameter is $_SERVER['PATHINFO']. Deze parameter geeft de URL na het script weer. Er zijn nog een aantal handige parameters, zie hieronder een lijst.

PathInfo parameters
Parameter Resultaat
_SERVER['REQUESTED_URI'] /mypath/script/jones?param=123
_SERVER['SCRIPT_NAME'] /mypath/script
_SERVER['PATH_INFO'] /jones
_SERVER['QUERY_STRING'] param=123
_SERVER['PATH_TRANSLATED'] /mypath/script/jones

Uiteraard is ook de PATH_INFO parameter onveilig en moet sanitized worden voordat deze gebruikt wordt in het script.

Nadelen

Aan deze methode kleeft ook een nadeel. Alle onbekende bestanden worden nu gezien als service-side php script. De webserver zal deze dus proberen uit te voeren. Zeker voor locaties waar gebruikers bestanden kunnen uploaden is dit een potentieel gevaar. Upload scripts filteren vaak op extenties en staan b.v. de extentie php niet toe omdat hiermee code kan worden geupload die uitgevoerd kan worden op de server. Met deze optie werkt dit filter dus niet meer!

Een ander gevaar is dat als de apache configuratie gewijzigd of verwijderd wordt de optie om alle onbekende scripts als PHP scripts te zien verdwijnt. Als gevolg hiervan zijn dus alle php scripts zonder of met onbekende extentie 'normale' text bestanden geworden. De webserver zal ze niet meer uit proberen te voeren, maar gewoon als text file laten downloaden. Hierdoor wordt de code in de php scripts zichtbaar voor bezoekers. Hierbij wordt dus vitale informatie beschikbaar voor potentiele hackers. Zeker als daarbij in php scripts wachtwoorden worden opgenomen voor b.v. databases.

Deze blog is getagd als PHP Programmeren REST Website

Google
facebook