SQL-injection en Header-bedreiging
SQL-injectionSQL-injection is de gevaarlijkste, moeilijkst te verhelpen en intressantste lek.
Bijvoorbeeld het volgende voorbeeld:
PHP Code
1 | <?PHP mysql_query("SELECT * FROM users WHERE admin=".$_POST['admin']." AND posts>=1"); ?> |
Hierbij is $_POST[‘admin’] een verborgen formulierveld op een vorige pagina. Deze is bijvoorbeeld standaard FALSE geprogrammeerd, maar wordt bijvoorbeeld door een ander controlescript op TRUE gezet.
Nu gaan we er van uit dat dat TRUE-OR-FALSE script veilig is. Maar let op! Het formulier is instelbaar bij de client! De waarde kan dus bijvoorbeeld worden veranderd naar ";'<|}~`/.. Dit veroorzaakt voor latere situaties een SQL error, die met wat pech een heleboel informatie over de server geeft die men niet mag weten.
Vroeger was het zelfs mogelijk om SQL in zo’n situatie UIT TE VOEREN! Maar dat is nu niet meer mogelijk.
Deze lek is ook niet zo makkelijk op te lossen. Je kunt beginnen met addslashes(), maar dan heb je niets meer dan een pagina-veilige string.
Beter is het om het bericht in te sluiten:
PHP Code
1 | "SELECT * FROM users WHERE admin='".addslashes($_POST['admin'])"' AND posts>=1" |
Nu kan de admin waarde niet uit zijn bedoelde functie springen. Bovendien is de waarde nu pagina-veilig.
Let op de quotes om addslashes($_POST[admin])! Deze vormen de tralies, en de functie addslashes() vormt de slaapspuit

Header-bedreiging
heb je hierboven al gezien. $_GET, $_SERVER, $_POST, $_COOKIE en $_SESSION zijn headers. Sommigen hiervan zijn eigendom van de client, anderen kunnen naar hartelust een andere eigenaar krijgen.
$_GET
is een waarde uit de adresbalk, bijvoorbeeld
http://www.site.com/page.php?getwaarde=stringblablavblagfjneagjk
Deze is veranderbaar tijdens het bezoeken van een pagina.
$_POST
is ook zo’n leuk dingetje dat de client mag veranderen, aangezien formulieren in de browser (OF TEKSTVERWERKER!) van de client worden uitgevoerd.
$_COOKIE
is precies hetzelfde
$_SESSION
is ongeveer een cookie, maar dan met de server als eigenaar. Dit lijkt veilig, maar de sessie-id wordt bij de client opgeslagen als cookie, get, of post.
Als je dus de cookies van de eigenaar hebt, kun je zijn sessie-id kopieëren naar die van jou (of verwisselen

Deze is erg gevaarlijk! Dit is jarenlang een lek is MSN Hotmail geweest! Men kon elkaars mail makkelijk lezen in die "goejuh ouwuh taait".
Ik raad je dus aan, schrijf je eigen session script, dat je op elke mogelijke manier kunt controleren. PHP’s SESSION functies zijn erg onveilig!
$_SERVER
is een wat minder gevaarlijke header. Deze kan je IP-adres bevatten, of de naam van je computer oid.
Conclusie tot nu toe:
Blijf alle inputs en outputs escapen! Gebruik min of meer altijd addslashes, en controleer zo veel mogelijk ip-adressen van de client.
Kleine tip:
Brute force is het proberen van alle mogelijke inputs om een hack-aanval op te zetten. Vertraag daarom al je pagina’s 1 seconde met sleep(1);
Je kunt ook nog na bijv. 10 pogingen om in te loggen alles wijgeren. Een gemiddelde gebruiker heeft het dan al lang opgegeven.