Veilig tegen SQL injection?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

SQL Developer / SQL DBA / Financiële instelli

Functieomschrijving Ben jij een ervaren SQL Developer / SQL DBA die houdt van een uitdaging? Heb je ruime ervaring met SQL, SQL Server, SSIS en het bouwen van queries? Lijkt het jou interessant om verantwoordelijk te zijn voor de gehele Nederlandse database omgeving van deze internationale financiële organisatie? Lees dan snel verder! Verantwoordelijk voor operationele werking van de database omgeving voor alle Nederlandse vestigingen; Schrijven van SQL queries; Beantwoorden complexe integratie vraagstukken; Meewerken aan uiteenlopende interne projecten en organisatiebrede migratie trajecten; Requirements opstellen; Fungeren als sparringspartner voor de business. Functie-eisen HBO werk- en denkniveau; Minimaal drie jaar ervaring in een

Bekijk vacature »

- Raoul -

- Raoul -

02/09/2010 22:21:53
Quote Anchor link
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

18/09/2019 10:06:22
 
Pim -

Pim -

02/09/2010 22:25:01
Quote Anchor link
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.
 
- Raoul -

- Raoul -

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

Kevin van Leeuwen

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

- Raoul -

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

Chris -

03/09/2010 09:30:26
Quote Anchor link
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 Anchor link
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 K

Niels K

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

Johan Dam

03/09/2010 11:19:35
Quote Anchor link
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 Anchor link
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 Anchor link
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 Anchor link
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?
 
- Raoul -

- Raoul -

03/09/2010 18:45:59
Quote Anchor link
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 Anchor link
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.
 
- Raoul -

- Raoul -

03/09/2010 18:52:37
Quote Anchor link
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 Anchor link
gewoon typecasten of intval gebruiken...
 
Pim -

Pim -

03/09/2010 20:36:23
Quote Anchor link
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 Anchor link
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.
 
- Raoul -

- Raoul -

03/09/2010 22:33:40
Quote Anchor link
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 Anchor link
Laten we het hier maar bij houden...
 
Mac Vato

Mac Vato

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



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.