MySQL injections Print E-mail
Written by Quzart   
Friday, 22 February 2008 14:14

Ook dit is een manier waarop veel websites gehacked worden, dus weer ff opletten bij het PHP scripten.

Wat is MySQL injection

De titel zegt het al een beetje. Iemand van buiten af kan MySQL injecten in je query's en zo dus vanalles met je database kan doen wat je waarschijnlijk niet zo leuk vind.

Voornamelijk gaat het om de functies mysql_query(), als een query verkeert wordt samengesteld dan kan het verkeert gaan.

Hoe werkt het

Stel dat je bijvoorbeeld een gebruiker wilt laten inloggen:

<?php

  define
"IN_PHP"true );
  require( 
'common.php' );

  
$username $_GET'username' ];
  
$password $_GET'password' ];

  
$q mysql_query"SELECT `id` FROM `users` WHERE `username` = '$username' AND `password` = '$password' LIMIT 1;" );

  if ( 
mysql_num_rows$q ) == )
  {
    
// Gebruiker is ingelogged.
  
}
  else
  {
    
// Username of wachtwoord is fout.
  
}

?>

Bedoeling

Gewoonlijk zou iemand gewoon kunnen inloggen (bijvoorbeeld de gebruiker 'koekjes' met het wachtwoord 'monster') en zou de query er zo uit zien:

SELECT `id` FROM `users` WHERE `username` = 'koekjes' AND `password` = 'monster' LIMIT 1;

Injection

Wat minder is als iemand zou invullen bij _GET[username]:

admin' --

Nou wordt dit de query:

SELECT `id` FROM `users` WHERE `username` = 'admin' --' AND `password` = 'monster' LIMIT 1;

Alles achter -- wordt in MySQL gezien als commentaar, de eigenlijk query is dus:

SELECT `id` FROM `users` WHERE `username` = 'admin'

Niet al te best dus, er wordt niet eens meer naar het wachtwoord gekeken!

Hoe tegen te gaan

Je moet gewoon ALLE user-input escapen:

<?php

  define
"IN_PHP"true );
  require( 
'common.php' );

  
$username mysql_real_escape_string$_GET'username' ] );
  
$password mysql_real_escape_string$_GET'password' ] );

  
$q mysql_query"SELECT `id` FROM `users` WHERE `username` = '$username' AND `password` = '$password' LIMIT 1;" );

  if ( 
mysql_num_rows$q ) == )
  {
    
// Gebruiker is ingelogged.
  
}
  else
  {
    
// Username of wachtwoord is fout.
  
}

?>

Nu kunnen MySQL injections niet meer. Stel dat iemand weer "admin'--" dit bij _GET[user] invult, dan wordt de query:

SELECT `id` FROM `users` WHERE `username` = 'admin\' --' AND `password` = 'monster' LIMIT 1;

Oftewel er wordt nu op de gebruikersnaam: "admin' --" gezocht, en de gebruiker kan dus niet meer MySQL injections uitvoeren.

Last Updated ( Friday, 22 February 2008 14:58 )
 
© 2008 - Designed by Quzart - Powered by Joomla!