Citat från Kennels artikel
Ett annat klassiskt misstag är att inkludera PHP-skript enbart baserat på vad som anges i URL:en. Det kan ibland vara praktiskt att skicka med en parameter till ett skript och att låta denna parameter bestämma vilket skript eller vilken sida som skall visas för besökaren. Man skulle t.ex. kunna tänka sig att man har ett skript index.php och att detta skript visar olika sidor beroende på vad man anger för page i URL:en. Skriver man in index.php?page=about.php skall sidan about.php inkluderas. Skriptet index.php kanske då kör följande kod:
include $_GET['page'];
En mycket dålig idé. En illvillig användare kan bara byta ut about.php mot något annat skript som han/hon kanske inte har tillgång till vanligtvis eller kanske t.o.m. en känslig fil någon annanstans på hårdisken på servern. Om man anropat skriptet med t.ex. page=/etc/passwd hade det skrivit ut innehållet i passwd-filen (om det är ett *NIX-system). Tro mig när jag säger att det är en dålig idé.
En vanligt förekommande åsikt är att problemet kan lösas genom att tvinga dit en filändelse på slutet av det som skall inkluderas. Såhär:
include $_GET['page'].'.php';
Detta löser dock inte problemet. Om magic_quotes_gpc är avstängt i php.ini (vilket det bör vara), kan man komma runt skyddet genom att anropa skriptet med t.ex. page=/etc/passwd%00 där %00 representerar tecknet NUL (vilket PHP tolkar som slutet på en sträng). Att bara smälla dit en filändelse på slutet är alltså en dålig idé det också.