Hallo,

Vaak lees ik over bugs als "MySQL injection". Wat is dit nou precies en hoe ga je het tegen? En hoe beveilig je je database eigenlijk?

Gr. Roel

[edit]
Sorry voor het lastig vallen, had niet goed gezocht bij tutorials.
[/edit]
Niemand kan het beter uitleggen dan wikipedia: Klik

EDIT: Hier op PHPHulp.nl staan ook nog wat tutorials over SQL injectie.
Gebruik PDO (minimaal PHP versie 5 vereist) voor het aanroepen van jouw database. Dan heb je geen last meer van SQL-injection.

Tevens kun je dan eenvoudiger een andere database, bv. PostgreSQL of FireBird, gaan gebruiken.
Frank heeft idd gelijk.

Verder is het trouwens eigenlijk SQL-injection en niet MySQL-injection. Want je injecteert SQL-code en niet een heel database systeem.
Wat is PDO dan en hoe gebruik ik het dan? En waarom zou je er dan geen last meer van hebben?
Roel schreef op 01.07.2007 14:26
Wat is PDO dan en hoe gebruik ik het dan? En waarom zou je er dan geen last meer van hebben?

Mr. G. Oogle zegt: Klikk0rz
De reden dat je dan geen last meer hebt van SQL injection zijn prepared statements, iets wat overigens net zo goed beschikbaar is in de MySQLi extensie.

Hier lees je meet over PDO::prepare.

PDO is de geen vrijwaring van SQL injection omdat je er bij PDO::query nog net zo goed last van kan hebben.
Snap niet helemaal hoe je het nou precies moet gebruiken.. maar ik deze tutorial "http://www.phphulp.nl/php/tutorials/3/244/452/"; staat op de 2e pagina een voorbeeld. Dit voorbeeld heb ik even nagemaakt:

<?php

include("includes/connect.php");

if($_POST['submit']) {
mysql_query("INSERT INTO `[test]` (naam, pass) VALUES ('" . $_POST['naam'] . "', '" . $_POST['pass'] . "')");
}
else {
PRINT <<<FORM

<html>
<head>
<title>TEST</title>
</head>

<body>
<form action="test.php" method="POST">
Naam: <input type="text" name="naam"><br>
Password: <input type="password" name="pass"><br>
<input type="submit" name="submit" value="Test">
</form>

</body>
</html>
FORM;
}
?>

connect.php maakt gewoon verbinding met me DB, dit script werkt ook gewoon alleen als ik dan probeer om hem te 'injecten' lukt hiet niet. Ik doe precies zoals het in het voorbeeld staat. Namelijk bij Naam "Pietje Puk', 'passwoord1'), ('Sinterklaas" invullen en bij Password gewoon een woord. Als ik dit doe komt er geen injection, hij voert het gewoon letterlijk in mijn DB in terwijl ik niks beveiligt heb, hoe kan dat:S

Ook snap ik de oplossing die ze geven niet helemaal. Er staat strip_slashes maar er moeten toch juist slashes bij voor de quotes?

Wie snapt dit en kan helpen?
Hoe zeg je? Blokhaken [] en backtics ` in je query proppen? Waarom zou je in vredesnaam die troep er in willen zetten?

Gooi deze zooi dus weg, ga je zitten schamen, gebruik ze nooit meer en vergeet dat je ze ooit hebt gebruikt.

Verder vergeet je de functie mysql_real_escape_string() te gebruiken en heb je waarschijnlijk het geluk dat magic_quotes is aangezet. Van dat soort toevaligheden wil je echter niet afhankelijk zijn. Kortom, beveiligen die queries!
mysql_real_escape_string() ben ik niet vergeten, ik heb dit script expres onbeveiligt gemaakt om te TESTEN. Maar het raren is dus dat het al geveiligt blijkt te zijn:S Maar dat komt dus door magic_quotes? En hoe zou jij deze query beveiligen? Er staat zoveel mogelijkheden

Reageren