sql injectie
ik heb nog even een vraagje over een sql injectie, ik heb een website gemaakt die er schijnbaar gevoelig voor is dus dat moet ik dicht gaan timmeren..
vandaag heb ik al de hele dag zitten lezen over sql injection maar ik blij toch nog met een paar vragen zitten:
op welke elementen kunnen sql injecties worden uitgevoerd?
o.a. $_POST geld dit ook voor $_GET?
bij het login script staat al:
$user = mysql_real_escape_string($user); (deze waarde is al eerder met $_POST opgehaald.
voor de rest zijn de inputboxen alleen voor mail formulier (deze staan dus niet gekoppeld aan de database) of zou ik deze waardes ook moeten escapen?
als iemand me op weg kan helpen hoor ik het graag,
alvast bedankt
Ik zeg altijd alles wat begint met $_ moet geëscaped / gefilterd / beveiligd worden ;)
Op alle variabelen waar gebruikers invloed op kunnen hebben, dus ook met sessie variabelen etc. die je in de database zet.
maar hoe kan ik zien of een sql injectie niet meer mogelijk is op een $_GET element
Met firebug kan ik jou radio-button selecteren en er iedere waarde aan geven die ik maar wil, daarna je formulier versturen.
Loop je code langs en overtuig jezelf dat iedere variabele die je in de database stopt langs een mysql_real_escape_string() geweest is.
Het maakt niet uit of de waarde uit $_POST, $_GET, $_COOKIE of wat dan ook komt.
Johan Dam op 10/02/2011 15:31:21:
(...)
Loop je code langs en overtuig jezelf dat iedere variabele die je in de database stopt langs een mysql_real_escape_string() geweest is.
Het maakt niet uit of de waarde uit $_POST, $_GET, $_COOKIE of wat dan ook komt.
Loop je code langs en overtuig jezelf dat iedere variabele die je in de database stopt langs een mysql_real_escape_string() geweest is.
Het maakt niet uit of de waarde uit $_POST, $_GET, $_COOKIE of wat dan ook komt.
Dit is een belangrijk punt, er wordt over het algemeen verondersteld dat mysql_real_escape_string alleen bedoelt is voor foutieve invoer van de gebruiker. Zelf als programmeur kan je ook fouten maken, daarom doe je altijd over alle waarden (tenzij ze integers o.i.d. zijn) mysql_real_escape_string.
Of gebruik maken van prepared statements (bijv. PDO (aanrader!! ) of mysqli). Ben je van dit gedoe velost.
als ik elke $_POST, $_GET, $_COOKIE door een laat lopen zou het in principe dus veilig moeten zijn voor een sql injection? of ben ik nu weer te kort door de bocht
Gewijzigd op 10/02/2011 15:50:55 door Nira Duursma
Bij mijn vorige werkgever gebruikten we een methode waar de sql er in printf vorm in ging, bv:
De variabele werden netjes ge-escaped en in quotes gezet (tenzij het een getal is)
Voor normaal gebruik lekker simpel en dankzij de verscheidenheid van de sprintf() ook voor minder 'normale' queries geschikt.
Voor de hele dynamische (lees: 'fucked up') queries schoot het wel eens te kort maar met wat uitbouwen had dat voorkomen kunnen worden..
sprintf is inderdaad een mooie oplossing. Staat ook op php.net: mysql_real_escape_string.
Let wel op dat je dus niet per se alles hoeft te escapen, alleen alles wat de database in gaat moet ge-escaped worden. Let ook op dat mysql_real_escape_string de data aanpast (maar niet op een grove manier zoals addslashes), dat betekend dus dat als je vergelijkingen o.i.d. wilt doen dat dat voor de mysql_real_escape_string moet gebeuren.
Gebruik maken van Let wel op dat je dus niet per se alles hoeft te escapen, alleen alles wat de database in gaat moet ge-escaped worden. Let ook op dat mysql_real_escape_string de data aanpast (maar niet op een grove manier zoals addslashes), dat betekend dus dat als je vergelijkingen o.i.d. wilt doen dat dat voor de mysql_real_escape_string moet gebeuren.
Gewijzigd op 10/02/2011 16:17:20 door Niels K
bedankt allemaal ik ga er mee aan de slag :)