VisionEars wordt Mulberries Agency

Wij gaan vanaf 1 september verder onder de naam Mulberries Agency. Naast de vertrouwde service die je van ons gewend bent hebben we ons ook gespecialiseerd op het gebied van Marketing Automation en Experiment Marketing.

Bekijk hier de website van Mulberries Agency Sluit popup

Download je gratis ebook: Marketing automation - 6 systemen vergeleken

Zoek je naar software om meer leads te converteren? Download onze gratis ebook waarin wij de 6 meest gebruikte softwarepakketten met elkaar vergelijken!

Download je gratis ebook: Infograpic stappenplan

Voor een geslaagde infographic heb je meer nodig dan goede data en een mooi design. Het moet een verhaal vertellen dat aansluit bij de doelgroep. Download ons heldere stappenplan en ga voor die perfecte infographic.

Download je gratis ebook: 10 tips voor een optimale webshop homepagina

De homepagina van je webshop is enorm belangrijk, want het is de first impression die telt. Een geoptimaliseerde homepagina is belangrijk voor het succes van je webshop.

Gratis consult: snelheidsoptimalisatie

Een snelle(re) website draagt bij aan de gebruikerservaring en levert meer conversies en dus omzet op. Wij helpen je graag op weg!

Wie onderstaand formulier invult, ontvangt een uitnodiging van een gratis consult. Tijdens dit gesprek bekijken we de betreffende website(s) en bespreken we samen alle mogelijkheden en valkuilen.

Gratis consult: Webshop optimalisatie

Voor een geslaagde webshop heb je meer nodig dan mooi design. Een goede gebruikerservaring, technisch in orde en zoekmachine geoptimaliseerd. Neem contact op voor een GRATIS consult. Wij nemen je webshop onder de loep zodat jij precies weet waar je kansen liggen en nog meer rendement uit je webshop kan halen.

Download jouw gratis ebook
  • Blog

Uw website beveiligen tegen hackers, best practices (deel 2)
15
Feb 2012
Web development

Uw website beveiligen tegen hackers, best practices (deel 2)

15 feb 2012 | Kevin | Web development

All input is tainted / Alle input is "besmet"!

Waarschijnlijk is de bovenstaande stelregel de allerbelangrijkste bij website beveiliging. De bovenstaande regel betekend in het kort dat alles dat direct of indirect, bewust of onbewust, door een bezoeker van de website wordt ingevuld kan worden misbruikt door een hacker. Je kunt hierbij allereerst denken aan formulieren die door gebruikers worden ingevuld. Maar ook aan cookies of sessie's waarin bijvoorbeeld voorkeuren van de gebruiker worden opgeslagen. Dit geldt ook voor data die een "gewone" gebruiker in eerste instantie niet kan "zien", zoals $_POST, $_SERVER en andere php superglobal's. Voor een hacker is het kinderlijk eenvoudig deze data te wijzigen (hiervoor wordt vaak de term "spoofen" gebruikt, wat letterlijk "foppen" of "beetnemen" betekend).

Tevens slaat "input" in de bovenstaande regel niet alleen op door gebruikers ingevoerde gegevens, maar ook op data die afkomstig is van andere (web)applicatie's of systemen. Je kunt hierbij denken aan RSS feeds van een externe applicatie, maar ook aan alle data die door de PC van de bezoeker van de website wordt verzonden. 

Voordat data uit de bovenstaande bronnen mag worden gebruikt in de website moet deze altijd gefilterd worden. Je kunt namelijk nooit zeker weten of deze data geen code bevat die je site in gevaar kan brengen. Pas na het scannen en filteren kan deze data als veilig worden beschouwd. Er zijn 2 basis methoden waarop data gefilterd kan worden: blacklist en whitelist filtering. 

Blacklist en whitelist filtering

Het verschil tussen blacklist en whitelist filtering zit in de manier waarop op "foute" input wordt gezocht.

Bij blacklist filtering wordt alle input tegen een "lijst" met niet toegestane code of karakters gehouden. Alles wat voorkomt in de "verboden" lijst wordt uit de input gefilterd. Deze methode lijkt op het eerste gezicht wellicht helemaal niet verkeerd, maar er zit één groot nadeel aan deze vorm van filtering.

Als voorbeeld nemen we een forum. Op dit forum mogen bepaalde woorden niet worden gebruikt, en dus wordt elke input van een gebruiker gescand op deze "verboden" woorden die in de blacklist zijn opgenomen. Als een woord in het bericht van de gebruiker is gevonden in de blacklist wordt dit woord verwijderd. Omdat taal zich echter constant ontwikkeld betekend dit dat de beheerders van het forum de "blacklist" met verboden woorden constant moeten bijhouden en waar nodig updaten.

Hetzelfde doet zich voor bij website beveiliging. Als je scant op "verboden" dingen in input, moet je deze lijst met "mogelijke hacks" constant updaten en bijhouden, naarmate hackers nieuwe technieken en methoden vinden om in sites in te breken. Veel verstandiger zou het dus zijn om de zaken om te draaien en te scannen op wat wél mag in plaats van wat níet mag.

Het scannen op wat wél mag wordt whitelist filtering genoemd. Whitelist filtering is veel veiliger, omdat je als programmeur veel meer controle hebt over datgene wat gebruikers naar jou website of webapplicatie kunnen sturen. Hoe zet je deze whitelist filtering op?

Hoe kan je effectief input filteren?

Maak allereerst een lege array waar alle gefilterde input in kan. Geef deze array een naam waaraan je direct kunt herkennen dat de waarden daarin gefilterd en te vertrouwen zijn. Loop daarna door de verschillende waarden heen die van de gebruiker afkomen en je in het vervolg van je script gaat gebruiken. Voor elk van deze waarden scan je op wat mag voorkomen in dit veld en als er andere tekens in deze waarde staan kopieer je deze niet naar de "schone" array. Dit zou er bijvoorbeeld als volgt uit kunnen zien:

$clean = array();
//Voorbeeld van een tekstveld in een formulier
if (ctype_alpha($_POST['name']))
{
    //Dit formulier veld wordt alleen naar de "schone" array 
    //gekopieerd als er niets anders dan letters uit het 
    //alfabet in voorkomen.
    //Behalve ctype_alpha kun je ook nog gebruik maken van
    //ctype_alnum en ctype_digit (zie php.net voor meer info).
    $clean['name'] = $_POST['name'];
}
//Voorbeeld van een selectbox of check/radio button
$colours = array("Red","Blue","Yellow","Green");
if (in_array($_POST['colour'],$colours))
{
    //Dit formulier veld wordt alleen naar de "schone" array
    //gekopieerd als er niets anders dan de vooraf 
    //gedefinieerde waarden in $colours in voorkomen
    $clean['colour'] = $_POST['colour'];
}

Het ergste wat met het bovenstaande script kan gebeuren is dat een bepaalde waarde niet naar de "schone" array wordt gekoieerd, waarna je een nette foutmelding kan tonen en de gebruiker de gelegenheid geeft het formulier opnieuw in te vullen. Andere functies die je kunt gebruiken om hetzelfde te bereiken zijn bijvoorbeeld filter_var() en filter_input().

Escape output

Wat is output? Output is alles dat je applicatie verlaat, bijvoorbeeld richting een gebruiker en dus webbrowser, een database server, xml bestanden enzovoort.

Filteren zorgt ervoor dat alleen "correcte" data je applicatie in komt, escapen daarentegen zorgt ervoor dat gebruikers of servers niet via jouw webapplicatie aangevallen kunnen worden. Het is erg belangrijk alle output goed te escapen omdat een webbrowser, de pc van een gebruiker of een database server bepaalde acties kan uit voeren aan de hand van speciale tekens en combinaties van karakters die vanuit jouw applicatie worden verzonden. Voor browsers bestaan deze speciale karakters bijvoorbeeld uit HTML tags, voor database servers onder andere uit aanhalingstekens en SQL code. Het bovenstaande laat duidelijk zien dat het escapen van output moet worden aangepast aan het doel waar de output heen gestuurd wordt. Bij het escapen van output voor een browser volstaan functies die output voor een database server escapen dus niet.

Escapen voor een browser

Om data die richting een browser wordt gestuurd te escapen biedt php 2 functies, namelijk htmlspecialchars() en htmlentities(). Van deze twee functies is htmlentities() het meest "grondig" en wordt dus aangeraden. Het escapen van output kun je op eenzelfde manier opzetten als het filteren van input. Maak een array aan voor elk doel waar data naar wordt verzonden, escape data bij het invoegen in die array en verzend alleen data vanuit die array om er zeker van te zijn dat alle output "ge-escaped" is. Zie het onderstaande voorbeeld waarbij het eerder gefilterde formulierveld "name" wordt getoond in de browser:

    $html = array();
    $html['name'] = htmlentities($clean['name'], ENT_QUOTES, 'UTF-8');
    echo $html['name']

Escapen voor een database server

Voor het escapen van output bestemd voor een database server biedt php een specifieke functie voor elke database driver. Bijvoorbeeld mysql_real_escape_string() of pg_escape_string(). Bij het escapen van output bestemt voor een database server kan dezelfde werkwijze worden aangehouden als bij het escapen voor een browser, zoals het volgende voorbeeld toont waarbij het eerder gefilterde formulierveld "name" in een database wordt opgeslagen:

    $mysql = array();
    $mysql['name'] = mysql_real_escape_string($clean['name'],$connection);
    mysql_query = "INSERT INTO persons SET name = '".$mysql['name']."'";

Hack methoden

Hoewel de bovenstaande regels erg belangrijk zijn om de meest hacks te voorkomen is het ook belangrijk specifieke hack methoden onschadelijk te maken, in onze volgende blogs zullen we hier verder op in gaan.

Deel deze blog post:

Kevin van Beers | Inbound marketing specialist

Kevin is inbound marketing specialist bij VisionEars. Naast social media heeft hij ook een passie voor marketing automation.

Neem contact met mij op Contact
blog comments powered by Disqus
© 2008-2019 - VisionEars B.V. - Meetbaar online succes