|
Ook dit is een manier waarop veel websites gehacked worden, dus weer ff opletten bij het PHP scripten.
Wat is MySQL injectionDe 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 ) == 1 ) { // 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 gaanJe 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 ) == 1 ) { // 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. |