Een van de belangrijkste dingen om je zorgen over te maken bij het ontwikkelen van een webapplicatie is de veiligheid van je website. Je website staat open voor de gehele wereld en ieder willekeurig persoon kan je website aanvallen. Omdat je van tevoren nooit weet van welke kant de aanval komt is het belangrijk om je website zo veel mogelijk dicht te timmeren zodat niemand je website kan aanvallen.
In een reeks van artikelen probeer ik uit te leggen hoe je, je website kunt beschermen tegen aanvallen van buitenaf. Vandaag gaan we het hebben over Cross-site scripting (XSS).
Cross-site scripting is een aanval waarbij een stuk kwaadwillende code op een website word geïnjecteerd Waneer iemand de pagina bezoekt, word de code uitgevoerd.
Case 1
Stel dat je een website hebt ontworpen waarop bezoekers reacties kunnen achterlaten:
<?php
echo "$gebruiker zei $bericht";
?>De code voor invoer van het bericht kan er als volgt uitzien:
<?php
$gebruiker = $_COOKIE['gebruiker'];
$bericht = $_REQUEST['bericht'];
if($bericht) {
opslaan_bericht($gebruiker, $bericht);
}
?>
<input type="text" name="bericht" value="<?php echo $bericht ?>">Zolang een gebruiker alleen maar simpele tekst invoert is er geen enkel probleem. Doordat er niet gecontroleerd wordt wat een gebruiker schrijft, kan iemand er willekeurige HTML code tussen plaatsten. Door bijvoorbeeld </div> in een bericht te plaatsen kan een aanvaller er bijvoorbeeld voor zorgen dat de HTML van je pagina niet meer klopt. Hoewel dit behoorlijk irritant is, is het nog behoorlijk onschuldig.
Een aanvaller kan ook bijvoorbeeld de volgende code in zijn bericht stoppen:
Wanneer iemand deze pagina dan bezoekt, word ook gelijk het script abcscript.js van de website h++p://abc.com uitgevoerd. Deze script kan dan bijvoorbeeld gebruikt worden om een virus te plaatsen op de computer van de bezoeker.
Case 2
Een tweede voorbeeld van een XSS aanval is een aanval via de URL van een website. Veel websites gebaseerd op WordPress hebben een zoekmachine ingebouwd.
Op deze site kan je zoeken door de volgende url in te typen:
http://zifp.nl/?s=zoekterm
In plaats van een zoekterm kan een aanvaller een stuk code invoeren:
http://zifp.nl/?s=<script type="text/javascript"> alert('XSS!') </script>
Gevaarlijk aan deze aanval is dat de url er zelf onschuldig uitziet:
http://zifp.nl/?s=%3Cscript%20type=%22text/javascript%22%3E%20alert('XSS!')%20%3C/script%3E
Je kan niet duidelijk zien of er sprake is van een script.
Doordat veel wordpress templates niet goed in elkaar zitten werkt bovenstaande code op een heleboel websites. Probeer maar eens.
Oplossing
Om te voorkomen dat een bezoeker kwaadwillende code op je website plaatst moet alle invoer op je website gecontroleerd worden op vijandige code en moet alle vijandige code verwijderd worden.
Een belangrijk hulpmiddel in het ontdekken van malafide code en het schoonmaken daarvan is PHP’s input_filter extensie.
We kunnen bovenstaande code dan in het volgende veranderen:
<?php
$gebruiker = filter_input(INPUT_COOKIE, 'gebruiker',
FILTER_SANITIZE_SPECIAL_CHARS);
$bericht = filter_input(INPUT_POST | INPUT_GET, 'bericht',
FILTER_SANITIZE_SPECIAL_CHARS);
if($bericht) {
save_message($gebruiker, $bericht);
}
?>
<input type="text" name="bericht" value="<?php echo $bericht ?>">Belangrijk is om de code zo snel mogelijk na de invoer te valideren en schoon te maken zodat malafide code bijvoorbeeld niet in je database kan opduiken. Hoe eerder de code schoon is, hoe minder fouten er gemaakt kunnen worden.
Er zijn een heleboel verschillende filters voor PHP beschikbaar. Gebruik de filters die toepasbaar zijn op jouw situatie en probeer altijd zo streng mogelijk te controleren.
Je kan er ook aan denken om bijvoorbeeld de functies
te gerbuiken. Deze functies worden gebruikt om speciale tekens naar de juiste HTML code en weer terug om te zetten.



