Ik bouw mijn site nu op door alle pagina's uit een database te laden.
De pagina's worden nu aangeroepen met bijv: www.mysite.com?id=2.
In dit geval zijn het alleen getallen, maar bij veel andere sites zie ik ook gewoon woorden.

Maar nu de uiteindelijke vraag.
Als ik dus nu de kijk of id een getal is en dan met sql de datbase uitlees is dan nog sql injection mogelijk?
@ Frank: is_numeric is met 1 m. Ik dacht eerst dat je een typfoutje maakte, maar je schrijft het twee keer met dubbel m in je post ;-)
@Jan: Zo af en toe ben ik uitermate consequent! Zelfs in mijn tikfouten...

Maar je hebt natuurlijk volkomen gelijk, het is met 1 m.
Dus het moraal van dit topic: Als je op ID checkt (dus nummeriek) gebruik ctype_digit(). Is_numeric() is een goede functie om te reken(bijv: 123,456) terwijl ctype_digit enkel hele getallen pakt(voor zover ik weet).

:)
Dus in dit geval moet ik gewoon controleren met ctype_digit()?
Maar als ik dan bijvoorbeeld toch met tekst wil zoals www.mysite.com?id=formular is dan mysql_real_escape_string() safe?
Klopt, en ook checken op toegestane strings. Als je bijvoorbeeld op die manier een pagina wilt includen, moet je een array maken met toegestane pagina's en met [php]in_array[/php] checken of de string okee is. De gebruiker kan in de adresbalk invullen wat hij wil, dus je moet overal op checken.
Arne De Herdt schreef op 15.12.2006 09:33
als je zeker wil zijn tegen SQL-injectie bouw je code dan zo op:

(php5 code)

if( isset($_GET['var']) {
if( is_numeric($_GET['var']) {
$var = $_GET['var'];
str_ireplace("DELETE","",$var);
str_ireplace("DROP","",$var);
str_ireplace("ALTER","",$var);
str_ireplace("GRANT","",$var);
str_ireplace("MODIFY","",$var);
str_ireplace("INSERT","",$var;
str_ireplace(";","",$var);
$QUERY = "SELECT x FROM y WHERE pageID='$var'";
}
}

Deze code zou je moeten beschermen tegen injecties. Tevens stript hij ook elk keyword nog eens uit je offset in de SQL



Dat is echt on nodig!

Maar weer ontopic:

Als je met bijvoorbeeld is_numeric() checkt of iets een getal is, dan kan het alleen een getal zijn, en is er dus geen gevaar.
Kijk anders deze eventjes door: http://www.phphulp.nl/php/tutorials/3/444/
Ik prefereer ctype_digit() ver boven is_numeric().
Omdat is_numeric() ook waarden in de min accepteert, wat nou niet echt de bedoeling kan zijn.
Andries Louw W. schreef op 15.12.2006 19:04
Ik prefereer ctype_digit() ver boven is_numeric().
Omdat is_numeric() ook waarden in de min accepteert, wat nou niet echt de bedoeling kan zijn.


Heb je gelijk in, maar voor dit script is is_numeric ook genoeg denk ik.

Reageren