MySQL en het afbreken van een kolom
woensdag, 10 september 2008, 11:56
De release van WordPress 2.6.2 lost wat veiligheidsprobleempjes op. Vervelend is dat het mij ook aan het werk zet. Niet zo zeer om WordPress te upgraden, maar omdat de fouten in vele applicaties zitten… en dus ook in die van mij.
Het is beschreven door Stefan Esser en het komt er op neer dat je dubbele rijen in database tabellen kan krijgen waar je unique moet hebben. Bijvoorbeeld een tabel met gebruikersnamen kent vaak de gebruiker ‘admin’. Aan de admingebruiker hangen vaak alle rechten die er zijn, dus je kan alles slopen.
Stel dat de kolom ‘username’ 20 karakters kwijt kan. Als je een nieuwe username invoert en je noemt deze ‘admin ‘ (dus met naloop spaties) zal dat niet lukken, omdat de naloop spaties niet worden mee vergeleken. Tot zover alles goed.
Nu geef ik 21 karakters mee, waarvan de laatste geen spatie is, maar bijvoorbeeld een x. Als er wordt vergeleken op ‘uniekheid’ (?) dan wordt er niets gevonden dat er op lijkt; ‘admin’ is wat anders dan ‘admin x’. Dus kan deze naam worden gebruikt en worden opgeslagen. Echter.. bij het opslaan wordt de username afgebroken op karakter 20 en zo hebben we opeens een gebruikersnaam ‘admin ‘ in de tabel zitten.
Wat je er verder mee kan… dat laat ik aan je eigen fantasie over. Ik weet zeker dat er heel veel code is waarin deze fout gemaakt is. De oplossing is vrij simpel. Als je in je query afgekapte strings meegeeft dan zal het nooit kunnen gebeuren. In PHP:
$sql = "INSERT INTO `table` (`username`) VALUES('".addslashes(substr($username, 0, 20))."');";
Happy Hacking!

Geef een reactie