Door
Ozzie PHP
op 26-06-2014 00:12
gewijzigd op 26-06-2014 00:12
2.074 views
Hi guys,
Ik vraag me af... hoe ver voeren jullie veiligheid door?
Stel je hebt een formulier waar een bezoeker zich kan inschrijven op jouw website.
Zo'n formulier bestaat uit een aantal velden, maar laten we ons heel simpel even focussen op het veld "voornaam".
Een bezoeker vult zijn voornaam in, en het formulier wordt verstuurd. Wat controleren jullie vervolgens?
Volgens mij is het gebruikelijk om te controleren of de naam minimaal x en maximaal y tekens heeft, en of het allemaal letters zijn en eventueel aparte tekens (bijv. een liggend streepje).
Maar... controleren jullie bijv. ook nog of er html-tags in voorkomen? Dus stel iemand vult niet "Jan" in maar "<script>I am an evil script!</script>"? Controleren jullie ook op dit soort dingen? Ik heb z'n vermoeden dat dit in de meeste gevallen niet gebeurt, maar ik ben toch wel benieuwd eigenlijk. En als er mensen zijn die hier wel op controleren, wat doe je dan als je bemerkt dat iemand de boel probeert te "hacken"?
Ik snap wat je bedoelt. Je moet er niet in doorslaan. Maar ik zou me kunnen voorstellen dat als iemand <script> in het "voornaam" veld plaatst, er iets niet in de haak is. Stel dat die persoon zich vervolgens toch inschrijft, is het wellicht zinvol om een "notitie" bij z'n naam te zetten. Dat is eigenlijk een beetje wat ik bedoel. Iemand kan van alles proberen, en zich vervolgens toch gewoon inschrijven zonder dat er iets wordt opgemerkt. Ik denk dat het in 99% van de gevallen zo gaat.
Dat zou je inderdaad wel kunnen doen: het opduiken van <script> in de input is dan een incident dat je logt in een security log.
De nadelen en gevaren van dat alles geheel automatiseren zijn echter niet te onderschatten:
- Je moet alle bekende aanvallen in kaart brengen. Ga er maar aanstaan: tel nog eens 2 jaar op bij de ontwikkeling van je platform.
- Je krijgt schijnzekerheid, want de beruchtste en kwaadaardigste hacks zijn meestal gericht op onontdekte en niet-gepubliceerde bugs. Ook in PHP en MySQL overigens: deze "fabrieken" hebben in het verleden wel eens terugroepacties gehad.
- Je krijgt door alle extra controles waarschijnlijk een onacceptabele performance. Daarom beperk je het tot kritieke applicaties, maar hang je er niet een complete site onder waar 99,9998% van de input onschuldig is.
- Je verzet waarschijnlijk dubbel werk als je een goed beveiligde webserver hebt. Een belangrijk deel van deze beveiliging is niet het domein van PHP, maar van je webserver, het file system en het OS.
Oké thanks. Alles ondervangen en loggen zal inderdaad niet te doen zijn. Misschien alleen wat simpele dingetjes dan. Naja... ik ga er dan voorlopig maar geen prioriteit van maken.
Het is op zich wel een goed topic, want je vraag "hoe ver voer je de beveiliging door?" is wel te beantwoorden met een lijst met enkele tientallen best practices. Dan zijn strip_tags() en htmlspecialchars() vooral twee bouwstenen in een groter geheel; de rest van de best practices moet je bij elkaar googelen en lezen.
Input passeert hier in verschillende vormen de revue, bijvoorbeeld met "unhelpful builtins" van PHP voor slashes, met PHP als gemankeerde template-taal vanwege het standaard ontbreken van controles op HTML-input en HTML-output (gebruik strip_tags en htmlspecialchars), mogelijkheden om de encoding te omzeilen (dwing UTF-8 af) en het onvoldoende controleren van uploads en superglobal arrays (bijvoorbeeld ongecontroleerde HTTP_-kopieën in $_SERVER).