Path Info
Gepost in /PHP ontwikkeling/Software op 15 Oktober 2012Deze 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.
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.