Wat kan je daadwerkelijk tegen mysql injections doen?

En hoe kunnen andere mensen zoeken naar mogelijke mysql injections in een nieuw gemaakte source?
mysql_real_escape_string() gebruiken.
jij kan op zoek gaan door bevoorbeeld in elke inputr een ' of " enzo te zetten dan kan het misgaan in de mysql
En als ik alle input die gedaan wordt in een query weg schrijf als volgt:

mysql_query("INSERT INTO leden(id,gebruiker,aangemeld,etc..." VALUES('','".$_POST['gebruiker']."','".$_POST['datum']."',etc...)) or die(mysql_error());

Is dit veilig omdat ik het tussen ' ' zet en dan ".$_POST['var']."

Of moet ik er meer tegen beveiligen?
Nee dat is niet veilig! Een ' in de input van een gebruiker levert nu namelijk een probleem op. En juist dit probleem zou misbruikt kunnen worden in de vorm van sql injectie.

Alle input van een gebruiker in de vorm van een string moet je beveiligen met de functie [php]mysql_real_escape_string[/php](). In het geval van integers zul je moeten controleren of het wel daadwerkelijk integers zijn. Gebruik bijvoorbeeld de functie [php]ctype_digit[/php]().
Over ctype_digit() gesproken. Als ik die gebruik op mijn home server dan krijg ik error van undefined function. Ik gebruik PHP 5.1

<?php
$query = "INSERT INTO leden(id,gebruiker,aangemelddatum)  VALUES ('','". mysql_real_escape_string($_POST['gebruiker'])."','".mysql_real_escape_string($_POST['datum'])."')";

?>


Overigens voldoet is_numeric ook wel om te checken of het een getal is.
Jurgen schreef op 07.04.2007 10:55
Over ctype_digit() gesproken. Als ik die gebruik op mijn home server dan krijg ik error van undefined function. Ik gebruik PHP 5.1
Vreemd. Het zou gewoon moeten werken. Maar goed, je kunt ook altijd nog is_numeric() gebruiken.
ok geweldig! Hartstikke bedankt jongens!

Als er meer beveiligings tips zijn, laat maar weten graag!
Voor checken of het een getal is kan je net zo goed intval() gebruiken. elk getal maakt die het integer value van. Deze kan je in tegenstelling tot is_numeric() gewoon in je query gebruiken, net zoals mysql_real_escape_string()
Hmm, intval() zou ik toch liever niet gebruiken. Deze functie kan nogal eens onverwachte resultaten opleveren. Zo kun je bijvoorbeeld al geen getallen groter dan 2147483647 (de maximale waarde van een integer op een 32 bit systeem) gebruiken.

En kijk bijvoorbeeld ook eens naar dit voorbeeldje.
<?php
echo intval(0031); // 25
?>
Je denkt dat je de landcode van Nederland ingevuld hebt, maar in je database komt 25 te staan...
Hey!! Dat is nieuw voor mij, maar goed dat je het zegt :) Dat is wel erg raar, maar dan zal ik dat zelf alleen gebruiken als het om een id of een normaal nummer gaat. (deed ik toch al, anders vallen voorloop nullen weg, dus dit soort dingen deed ik met een regex)

Reageren