Veilig tegen SQL injection?
Hallo
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?
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?
Gesponsorde koppelingen:
het kan idd op die manier, maar wil je het super veilig hebben raad ik een van deze 2 manieren aan, in jou manier zou ik gaan voor manier 2 :-)
ja kijk, je hebt diverse opties, een ervan is om dit te doen :
manier 1 :
zo controlleer je of de get waarde daadwerkelijk 10,25,50 of 100 is zoniet : geef een foutmelding. De andere optie is : (manier 2):
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
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
Methode 2 doe ik gewoon, maar zonder die checks op versies.
En waarom stripslashes je doet doet mysql_real_escape_string()?
En waarom stripslashes je doet doet mysql_real_escape_string()?
Als je zou lezen, zou je zien dat dat gaat over de magic_quotes_gpc die bij een aantal hosters standaard online staan.
Je kan beter kijken naar php prepared statements[/url] :-)
Je kan beter kijken naar php prepared statements[/url] :-)
als je een cijfer verwacht dan kan je beter iets doen als het volgende
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.
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.
Omdat je dan nog steeds rare resultaten kan krijgen, het enige wat je weet is dat er geen resultaten zijn, maar waarom weet je niet, misschien omdat iemand iets probeerd of misschien omdat er een fout in de code zit, of misschien klopt er iets anders niet.
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
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
Er zijn geen resultaten, dus pagina niet gevonden..
Als een persoon zelf loopt te klooien met de url zal die zelf wel door hebben waarom.
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?
En waarom zou dit niet kunnen werken?
Is dit niet simpeler?
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 :)";
}
?>
Dat werkt wel, maar waarom zou je die 'stout kind' melding weergeven ipv een 404 error?
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.
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
gewoon typecasten of intval gebruiken...
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?
*delete*
Gewijzigd op 04/09/2010 14:22:15 door Mac Vato


