Veilig tegen SQL injection?
Ik heb een pagina gemaakt met get waarden (?id=en_een_nummer)
ik doe de query met mysql_real_ecape_string, en als ik ?id=1\ doe werkt
de pagina gewoon :S
Is dit normaal?
En uhm... ik snap het niet echt
ja kijk, je hebt diverse opties, een ervan is om dit te doen :
manier 1 :
Code (php)
zo controlleer je of de get waarde daadwerkelijk 10,25,50 of 100 is zoniet : geef een foutmelding. De andere optie is : (manier 2):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
function quote_smart($value) {
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if(version_compare(phpversion(),"4.3.0") == "-1") {
return mysql_escape_string($value);
} else {
return mysql_real_escape_string($value);
}
}
?>
function quote_smart($value) {
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if(version_compare(phpversion(),"4.3.0") == "-1") {
return mysql_escape_string($value);
} else {
return mysql_real_escape_string($value);
}
}
?>
Let op! Ik neem aan dat je PHP 5 gebruikt bij de meeste hosters is de get_magic_quotes aangzet bij phpversie lager dan 4 moet je die nog aanzetten.
groeten,
Kevin
Gewijzigd op 02/09/2010 22:33:30 door Kevin van Leeuwen
En waarom stripslashes je doet doet mysql_real_escape_string()?
magic_quotes_gpc die bij een aantal hosters standaard online staan.
Je kan beter kijken naar php prepared statements[/url] :-)
Als je zou lezen, zou je zien dat dat gaat over de Je kan beter kijken naar php prepared statements[/url] :-)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
if(!ctype_digit($id)){
// Geen cijfer, DANGER
} else {
// doorgaan met code,
}
?>
if(!ctype_digit($id)){
// Geen cijfer, DANGER
} else {
// doorgaan met code,
}
?>
Dan hoef je ook geen cpu kracht meer te verspillen aan mysql_real_escape_string want als het een getal is kan het nooit mysql code bevatten.
Waarom gewoon niet zoals Pim zegt?
Het is altijd beter om precies te weten wat er gebeurd ipv van een 'oh dit werkt ookwel' methode.
Bovendien denk ik dat een controle met ctype digit sneller is dan een conversie, maar dit weet ik niet 100% zeker
Als een persoon zelf loopt te klooien met de url zal die zelf wel door hebben waarom.
Hipska, het kan heel onschuldig zijn; verkeerd afgesloten BB codes, chats waar nog een extra teken achter komt.
Vrijwel iedereen zal mijn methode aanraden: gewoon typecasten naar int en dan bij 0 num rows gewoon een 404 geven, dat is toch precies het resultaat dat je wil bereiken? Of wil je echt een foutmelding geven: 'onjuiste karakters in id?' Dat slaat toch nergens op?
Is dit niet simpeler?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
if (!is_numeric($_GET["id"])){
echo "stout kind!";
}else{
echo "braaf :)";
}
?>
if (!is_numeric($_GET["id"])){
echo "stout kind!";
}else{
echo "braaf :)";
}
?>
En verder is een typecast een taalconstructie (if, echo, include e.d.) en geen functie, en daarmee waarschijnlijk sneller, hoewel dit soort micro-optimalisaties meestal volstrekte onzin zijn.
Dit is inderdaad onzin. Je site is zeker niet verpest omdat het laden 0.00005 seconden langer duurt :s
intval gebruiken...
gewoon typecasten of Internet Verslaafde op 03/09/2010 18:52:37:
Dit is inderdaad onzin. Je site is zeker niet verpest omdat het laden 0.00005 seconden langer duurt :s
Heb je überhaupt gelezen wat ik schreef?
Pim de Haan op 03/09/2010 20:36:23:
Heb je überhaupt gelezen wat ik schreef?
Internet Verslaafde op 03/09/2010 18:52:37:
Dit is inderdaad onzin. Je site is zeker niet verpest omdat het laden 0.00005 seconden langer duurt :s
Heb je überhaupt gelezen wat ik schreef?
Beetje naief, Pim.
Je kunt niet het denkvermogen van iedereen zo ruim schatten.
Pim de Haan op 03/09/2010 20:36:23:
Heb je überhaupt gelezen wat ik schreef?
Internet Verslaafde op 03/09/2010 18:52:37:
Dit is inderdaad onzin. Je site is zeker niet verpest omdat het laden 0.00005 seconden langer duurt :s
Heb je überhaupt gelezen wat ik schreef?
Wat denk je nu zelf?
Laten we het hier maar bij houden...
Gewijzigd op 04/09/2010 14:22:15 door Mac Vato