sql injectie

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nira Duursma

Nira Duursma

10/02/2011 15:03:02
Quote Anchor link
Hoi,

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
 
PHP hulp

PHP hulp

05/11/2024 07:46:20
 
Niels K

Niels K

10/02/2011 15:07:33
Quote Anchor link
Stelregel: Vertrouw nooit user input.

Ik zeg altijd alles wat begint met $_ moet geëscaped / gefilterd / beveiligd worden ;)
 
Arjan -

Arjan -

10/02/2011 15:09:37
Quote Anchor link
Op alle variabelen waar gebruikers invloed op kunnen hebben, dus ook met sessie variabelen etc. die je in de database zet.
 
Nira Duursma

Nira Duursma

10/02/2011 15:15:39
Quote Anchor link
Hoi Niels dat is duidelijk

maar hoe kan ik zien of een sql injectie niet meer mogelijk is op een $_GET element
 
Niels K

Niels K

10/02/2011 15:19:19
Quote Anchor link
Er zijn programmatjes die het helemaal voor je testen bijvoorbeeld: Havij
Gewijzigd op 10/02/2011 15:19:32 door Niels K
 
Johan Dam

Johan Dam

10/02/2011 15:31:21
Quote Anchor link
Zoals gezegd, gebruikers niet vertrouwen.

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.
 

10/02/2011 15:34:03
Quote Anchor link
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.


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.
 
Arjan -

Arjan -

10/02/2011 15:37:04
Quote Anchor link
Of gebruik maken van prepared statements (bijv. PDO (aanrader!! ) of mysqli). Ben je van dit gedoe velost.
 
Nira Duursma

Nira Duursma

10/02/2011 15:48:34
Quote Anchor link
@ Karl

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
 
Johan Dam

Johan Dam

10/02/2011 15:50:14
Quote Anchor link
Of maak je eigen db classe, niet moeilijk en lekker licht (of zwaar.. als je grote eisen hebt)

Bij mijn vorige werkgever gebruikten we een methode waar de sql er in printf vorm in ging, bv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$db->sql("INSERT INTO users (%s,%s)", $voornaam, $achternaam);


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..
 

10/02/2011 16:16:51
Quote Anchor link
Gebruik maken van 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.
 
Niels K

Niels K

10/02/2011 16:17:02
Quote Anchor link
Zend_Db_Table(Row) FTW :)
Gewijzigd op 10/02/2011 16:17:20 door Niels K
 
Nira Duursma

Nira Duursma

10/02/2011 16:36:04
Quote Anchor link
bedankt allemaal ik ga er mee aan de slag :)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.