Veilig tegen SQL injection?

Overzicht Reageren

Internet Verslaafde

Internet Verslaafde

02/09/2010 22:21:53
Quote
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?
 
PHP hulp

PHP hulp

09/02/2012 06:20:07
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Pim -

Pim -

02/09/2010 22:25:01
Quote
Een id kan je gewoon naar interger typecasten. Dus
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$q
= 'SELECT content FROM pages WHERE id = '.(int)$_GET['id'];

Als er dan onzin wordt opgegeven krijg je, als het goed gemaakt heb en rekening houdt met 404 errors, een niet gevonden melding.
 
Internet Verslaafde

Internet Verslaafde

02/09/2010 22:25:53
Quote
En uhm... ik snap het niet echt
 
Kevin van Leeuwen

Kevin van Leeuwen

02/09/2010 22:28:10
Quote
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 :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$valid_prices
= array(10, 25, 50, 100);
if(!in_array($_GET['price'], $valid_prices)){
   die("Hack attempted!");
}
else{
   // ga door met de code
} ?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
}
}

?>


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
 
Internet Verslaafde

Internet Verslaafde

02/09/2010 22:40:17
Quote
Methode 2 doe ik gewoon, maar zonder die checks op versies.
En waarom stripslashes je doet doet mysql_real_escape_string()?
 
Chris Horeweg
Beheerder

Chris Horeweg

03/09/2010 09:30:26
Quote
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] :-)
 
Johan Dam

Johan Dam

03/09/2010 10:54:24
Quote
als je een cijfer verwacht dan kan je beter iets doen als het volgende

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
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.
 
Niels Kieviet
Moderator

Niels Kieviet

03/09/2010 11:11:47
Quote
Waarom gewoon niet zoals Pim zegt?
 
Johan Dam

Johan Dam

03/09/2010 11:19:35
Quote
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
 
Hipska BE

Hipska BE

03/09/2010 11:51:01
Quote
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.
 
P Lekensteyn

P Lekensteyn

03/09/2010 12:53:57
Quote
Hipska, het kan heel onschuldig zijn; verkeerd afgesloten BB codes, chats waar nog een extra teken achter komt.
 
Pim -

Pim -

03/09/2010 13:42:41
Quote
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?
 
Internet Verslaafde

Internet Verslaafde

03/09/2010 18:45:59
Quote
En waarom zou dit niet kunnen werken?
Is dit niet simpeler?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

if (!is_numeric($_GET["id"])){
echo "stout kind!";
}
else{
echo "braaf :)";
}


?>
 
Pim -

Pim -

03/09/2010 18:49:52
Quote
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.
 
Internet Verslaafde

Internet Verslaafde

03/09/2010 18:52:37
Quote
Dit is inderdaad onzin. Je site is zeker niet verpest omdat het laden 0.00005 seconden langer duurt :s
 
Niek s

niek s

03/09/2010 20:10:40
Quote
gewoon typecasten of intval gebruiken...
 
Pim -

Pim -

03/09/2010 20:36:23
Quote
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?
 
Niek s

niek s

03/09/2010 21:43:50
Quote
Pim de Haan op 03/09/2010 20:36:23:
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.
 
Internet Verslaafde

Internet Verslaafde

03/09/2010 22:33:40
Quote
Pim de Haan op 03/09/2010 20:36:23:
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?
 
Pim -

Pim -

03/09/2010 23:24:26
Quote
Laten we het hier maar bij houden...
 
Mac Vato

Mac Vato

04/09/2010 14:20:44
Quote
*delete*
Gewijzigd op 04/09/2010 14:22:15 door Mac Vato
 



Overzicht Reageren