SQL Injection voorkomen
Ik had een vraag over het voorkomen van SQL injection. Ik had een functie gemaakt van wat ik er zoal over heb gevonden, maar ik vroeg me af of onderstaande code volstaat? Of zijn er nog dingen die ik zou moeten toevoegen? Hoe hebben jullie je hier tegen beveiligd? En überhaupt wel eens gehoord, of gehad, dat er op deze manier werd ingebroken?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
function make_safe($var) {
global $con;
$var = htmlspecialchars(strip_tags(trim($var)));
$var = mysqli_real_escape_string($con, $var);
$var = addcslashes($var, '%_');
return $var;}
global $con;
$var = htmlspecialchars(strip_tags(trim($var)));
$var = mysqli_real_escape_string($con, $var);
$var = addcslashes($var, '%_');
return $var;}
Groet
Het gebruik van mysqli_real_escape_string() op de $_POST, $_GET, $_COOKIE, $_SESSION en $_ENV variabelen is al voldoende. Het gebruik van htmlspecialchars() is alleen praktisch bij het uitlezen van de data. Je wilt deze in bijna geen enkel geval gebruiken bij het INSERT'en of UPDATE van data in een query.
Op alle gebruikers input wat je in je database INSERT of UPDATE kun je *real_escape_string gebruiken. Dit is voldoende, maar om te voorkomen dat bijv. code wordt uitgevoerd die je ophaalt met SELECT kun je htmlspecialchars gebruiken.
Je kunt i.p.v. MySQLi ook PDO gebruiken en met bindings werken. Zie voorbeelden hier
Prepared statements in PDO zorgen dan dat je data op een veilige manier worden geüpdatet of toegevoegd.
Zoals aangegeven is escaping zelf al voldoende. Je moet je data veilig maken, niet verminken. htmlspecialchars, trim en strip_tags vernielen je data op een manier die je later onmogelijk kunt herstellen, dus gebruik je ze bij weergave wanneer nodig.
Omdat ik per pagina vaak meerdere GET ophaal leek het me praktischer om ze in een functie te stoppen, dan om elke keer de hele riedel te herhalen.
Gewijzigd op 16/09/2016 21:54:20 door G Jansma
Nee, dat is ook daar niet handig, want je gebruikt htmlspecialchars e.d om de data UIT je database weer te geven, niet tijdens het selecteren, inserten of updaten.
Bij de uitvoer van de data heeft htmlspecialchars() pas zin tegen XSS-protectie. En dat gebeurt ook in de tutorial.
Precies. Dat gebeurt bij de weergave van de data, niet in de query zelf. Daar is het zinloos, en kan tot foutieve resultaten leiden.
Stel je zoekt naar C&A
Dan plaats jij dus in de query:
SELECT * FROM tabel WHERE naam = 'C&A'
in je database staat echter C&A
dus jij vindt niets.
htmlspecialchars() is een functie die je eigenlijk alleen bij echo gebruikt.
---
en om de slimmerik voor te zijn die dan in de database C&A wil opslaan: wat nu als je die naam niet op een webpagina wil weergeven, maar wilt gebruiken om een excelsheet te vullen? dan heb je alleen maar last van die escapete data.
Maar als iemand zoals in de tutorial zoekt op 'Kees"/>', en ik wil dat vervolgens echoën in het zoekvak, dan is het wel aan te raden om de htmlspecialchars te gebruiken toch?
>> Op zich is het dus niet zozeer schadelijk, maar ik begrijp dat het niet nodig is. De mysqli_real_escape_string volstaat dus in deze?
In dit specifieke geval is het niet zozeer schadelijk, maar er komt een moment/een project waar je zinloze "truc" wel tot problemen leidt, en dan heb je in het ergste geval reparaties uit te voeren aan je data. Baat het niet dan schaadt het niet gaat hier niet echt op, belangrijker is consistentie.