en pt nl nl en af et nl nl nl nl en nl nl nl nl it nl nl ilo nl en nl nl de nl nl de en nl nl nl nl nl nl nl en en nl nl nl en nl nl nl nl nl de nl fr nl it nl it nl it nl nl ceb nl it nl
Hoewel dit lek rond het jaar 2000 al bekend is zijn er nog steeds websites die kwetsbaar zijn voor een SQL injectie.
Hoe gaat een SQL injectie dan in zijn werk?
Voorbeeld code kwetsbaar voor SQL injections
De bovenstaande code is kwetsbaar voor een SQL injectie. Als ik nu pagina.php?newsID=1 doe zal er niets gebeuren maar zodra ik een quote achter de 1 type zal er een mysql error getoont worden. Want php zal alles wat je in newsID= plaatst letterlijk in de query zetten.
De onderstaande code zal een SQL injectie tegen gaan!
%s", $row['title'], $row['content']); } }
De bovenstaande code was de oplossing tegen een MySQL injection.
De volgende in de lijst is een XSS attack. Met een XSS attack kan een kwaadwillende code in de website plaatsen om zo cookies te stelen of kan hij iets in de website aanbrengen waardoor hij achter jouw wachtwoord kan komen.
Voorbeeld code kwetsbaar voor XSS
<?php if(isset($_GET['message'])) { echo $_GET['message']; }
Als de hacker nu pagina.php?message=  doe zal er een login scherm verschijnen in de website.
De oplossing tegen een XSS attack.
<?php if(isset($_GET['message'])) { echo htmlspecialchars($_GET['message']); }
3. Local File Inclusion (LFI)
Local File Inclusion is een gevaarlijke kwetsbaarheid hiermee kan de hacker alle bestanden op de server uitlezen.
Voorbeeld code kwetsbaar voor Local File Inclusion
<?php if(isset($_GET['page'])) { $page = $_GET['page']; //Kijken of de pagina wel bestaat if(file_exists($page)) { include_once $page; }else { die('pagina niet gevonden!'); } }
Wat kan een hacker nu doen? Normaal zal de url iets zijn zoals /index.php?page=home.php zoals als je ziet vragen we het bestand home.php op.
Maar doordat we niet checken welk bestand de gebruiker opvraagt kan hij gewoon alle bestanden in de server opvragen. Om een voorbeeld te
nemen /index.php?page=../../etc/passwd de hacker zou zo achter configuratie bestanden of backups kunnen komen en dat is uiteraard niet de bedoeling.
<?php if(isset($_GET['page'])) { $page = $_GET['page']; switch($page){ case 'home': include_once 'home.php'; break; default: die('Niet gevonden!'); } }
Met een Arbitrary File Download exploit kan een gebruiker alle bestanden van de server downloaden.
Vorig jaar heb ik zo nog een lek gevonden in Smartschool dus je ziet dat het ook in grote website's voorkomt.
<?php if(isset($_GET['streamPath'])) { $path = $_GET['streamPath']; header("Content-Type: application/octet-stream"); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=".$path." "); echo readfile($path); }
Als de kwaadwillende nu bijvoorbeeld download.php?streamPath= kan de gebruiker alle bestanden van de server downloaden en zo zelfs aan database wachtwoorden komen.
Hoe beveilig ik mij hiertegen? Simpel altijd goed valideren welke bestanden de gebruiker download.
Wow, bedankt dat je tot hier hebt gelezen. Ik hoop dat ik in deze tutorial jullie wat heb kunnen bijleren over beveiliging.
Er zijn inderdaad nog tal van lekken! Ben ik iets vergeten of heb ik iets niet goed uitgelegd mag je mij altijd verbeteren.
Mooi artikel. Misschien kun je nog uitleggen hoe het precies komt dat SQL injection werkt als je het niet escapet (namelijk dat alles wat je in de ?id typt letterlijk in de query wordt geplakt) en waarom je oplossingen ervoor zorgen dat het wel beveiligd is. Voor de rest, prima! ðŸ‘
Escapen kan, toch gebruik ik liever prepared statements. Waarom? Ik vind dat het net wat cleaner lijkt. Als je met verschillende bestanden/classes werkt dan zie je niet direct of je een input escaped is. Parameter binding houdt het erg daarnaast overzichtelijk. Als je jezelf dit aanleert kun je in één oogopslag zien of je query wel veilig is. 😀
[verwijderd] Ondertussen al uitgevonden?
Kun je me ook vertellen hoe Cache poisening werkt met HTTPS_HOST
In nummer 3 hoef je trouwens echt geen case te gebruiken. Je kan met htaccess alles doorsturen naar index.php en vervolgens met PHP de path ophalen.
Maar niet HTTPS_HOST gebruiken want dat heeft weer met Cache poisoning te maken
Daarbij kan je gewoon de php rekest_method gebruiken en de post / get value filteren dmv filter_input(_array('METHOD', PDO_TYPE)), hier werkt PDO naar mijn idee weet een stuk flexibeler in zonder omslachtige toevoegingen wanneer je dit + prepared statements gebruikt