SQL Injection Guide
Beschrijving hoe iemand SQL injection gebruikt, en wat je er tegen kan doen.
Dit is een beknopte tutorial, verwacht er niet teveel van zal ik maar zeggen ;-)
Gesponsorde koppelingen
Inhoudsopgave
- Inleiding
- Is SQL Injection mogelijk?
- SQL Injection, Hoe krijg ik datastructuur?
- SQL Injection, Data bewerken
- Wat kan ik er tegen doen?
- Bronnen en extra
42 reacties op 'SQL Injection Guide'
Gesponsorde koppelingen
Misschien nog een aanvulling op de tutorial:
gebruik altijd quotes in een query voor de variabelen, voorbeeldje:
Bij onderstaande query kan ik gewoon $variabele gelijk maken aan:
23;DELETE FROM tabel
En zeg maar dag dag records ;D
edit:
ooo vergeten, mooie tutorial..
gebruik altijd quotes in een query voor de variabelen, voorbeeldje:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$sQuery = 'SELECT * FROM tabel WHERE id = \'' . $variabele . '\'';
// EN NIET:
$sQuery = 'SELECT * FROM tabel WHERE id = ' . $variabele;
?>
$sQuery = 'SELECT * FROM tabel WHERE id = \'' . $variabele . '\'';
// EN NIET:
$sQuery = 'SELECT * FROM tabel WHERE id = ' . $variabele;
?>
Bij onderstaande query kan ik gewoon $variabele gelijk maken aan:
23;DELETE FROM tabel
En zeg maar dag dag records ;D
edit:
ooo vergeten, mooie tutorial..
Nooit vertrouwen wat anderen zeggen over PHP? :S
Ik dacht echt dat het beperkt was door PHP.
Ikzelf gebruik voor integers meestal het o zo gemene intval() of gewoon typecasting (int)
Misschien is het leuk om in de 'wat kan je er tegen doen' magic_quotes_rpc ook even te vermelden, en even aan te geven dat dit niet een oplossing is aangezien dat alleen maar lastig is en toch binnenkort weer uit PHP geslingerd wordt.
Ik dacht echt dat het beperkt was door PHP.
Ikzelf gebruik voor integers meestal het o zo gemene intval() of gewoon typecasting (int)
Misschien is het leuk om in de 'wat kan je er tegen doen' magic_quotes_rpc ook even te vermelden, en even aan te geven dat dit niet een oplossing is aangezien dat alleen maar lastig is en toch binnenkort weer uit PHP geslingerd wordt.
Ik heb hier een mooie oracle SQL leerboek en daarin staat:
"Let op het subtiele verschil tussen 123 en '123'! Het verschil tussen numerieke en alfanumerieke constanten komt met name tot uiting in hun bewerkingsmogelijkheden. Numerieke constanten kunnen bijvoorbeeld worden opgeteld, of met elkaar vermenigvuldigd. Met alfanumerieke constanten gaat dat niet; die kun je bijvoorbeeld aan elkaar plakken"
Maar dat is ook al weer een oude boek over Oracle7 en 8i
"Let op het subtiele verschil tussen 123 en '123'! Het verschil tussen numerieke en alfanumerieke constanten komt met name tot uiting in hun bewerkingsmogelijkheden. Numerieke constanten kunnen bijvoorbeeld worden opgeteld, of met elkaar vermenigvuldigd. Met alfanumerieke constanten gaat dat niet; die kun je bijvoorbeeld aan elkaar plakken"
Maar dat is ook al weer een oude boek over Oracle7 en 8i
Quote:
Martijn! schreef op 01.11.2006 22:12
Ik heb hier een mooie oracle SQL leerboek en daarin staat:
"Let op het subtiele verschil tussen 123 en '123'! Het verschil tussen numerieke en alfanumerieke constanten komt met name tot uiting in hun bewerkingsmogelijkheden. Numerieke constanten kunnen bijvoorbeeld worden opgeteld, of met elkaar vermenigvuldigd. Met alfanumerieke constanten gaat dat niet; die kun je bijvoorbeeld aan elkaar plakken"
Maar dat is ook al weer een oude boek over Oracle7 en 8i
Gewijzigd op 01.11.2006 22:12 door Martijn!
Ik heb hier een mooie oracle SQL leerboek en daarin staat:
"Let op het subtiele verschil tussen 123 en '123'! Het verschil tussen numerieke en alfanumerieke constanten komt met name tot uiting in hun bewerkingsmogelijkheden. Numerieke constanten kunnen bijvoorbeeld worden opgeteld, of met elkaar vermenigvuldigd. Met alfanumerieke constanten gaat dat niet; die kun je bijvoorbeeld aan elkaar plakken"
Maar dat is ook al weer een oude boek over Oracle7 en 8i
Gewijzigd op 01.11.2006 22:12 door Martijn!
Maar jij hebt het over _O_ Oracle dat is wel wat anders dan mysql. Mysql is niet zo nauwkeurig als het op wel of geen ' ' aankomt
Dat klopt wel Klaasjan, maar dat betekend niet dat je het niet beter op die manier kan doen. De manier van Martijn! waarbij hij zegt dat 123 en '123' anders zijn klopt, MySQL slikt dit, maar als je nu naar een ander type database overstapt?
Precies, dan kan je je beter aan de standaard hebben gehouden, dat scheelt aanpassingen. Daar komt bij dat je je sowiezo beter aan de gestelde standaard kan houden, om fouten te voorkomen.
== Mooie tut hoor ==
Precies, dan kan je je beter aan de standaard hebben gehouden, dat scheelt aanpassingen. Daar komt bij dat je je sowiezo beter aan de gestelde standaard kan houden, om fouten te voorkomen.
== Mooie tut hoor ==
Je zou ook van te voren kunnen checken of een variabele in de querie een getal is. Dan hoef je de query niet meer uit te voeren, als dit niet zo is. Maar ik vind eigelijk niet dat single-quotes om numerieke waardes in queries verkeerd zijn, ik zie het meer als extra zekerheid voor als je waarde check faalt. En schijnbaar kan Oracle ook hiermee omgaan.
@Legolas:
MySQL heeft een strict modes, maar of dat wat help.
PHP mag wat mij betreft een optie in de parser maken die een error geeft als je bagger code hebt gemaakt. Hopen dat PHP6 alle bagger oplossingen aanpakt .
@Legolas:
MySQL heeft een strict modes, maar of dat wat help.
PHP mag wat mij betreft een optie in de parser maken die een error geeft als je bagger code hebt gemaakt. Hopen dat PHP6 alle bagger oplossingen aanpakt .
Hipska schreef op 02.11.2006 10:30
php voert met mysql_query() alles na de ; toch niet meer uit?
(heb het gistere toevallig nog geprobeerd)
nee klopt, maar in een string wel... want anders zou je geen ; in een bericht kunnen zetten bijvoorbeeld.
mysql_query("SELECT * FROM poep; TRUNCATE TABLE henk"); werkt gewoon hoor...
(edit: typos onder voorbehoud :p)
php voert met mysql_query() alles na de ; toch niet meer uit?
(heb het gistere toevallig nog geprobeerd)
nee klopt, maar in een string wel... want anders zou je geen ; in een bericht kunnen zetten bijvoorbeeld.
mysql_query("SELECT * FROM poep; TRUNCATE TABLE henk"); werkt gewoon hoor...
(edit: typos onder voorbehoud :p)
@leroy
Als je het heel strikt bekijkt moet je 123 gebruiken en geen '123' alleen maakt het volgens mij niets uit. Wil je iets bij dat getal optellen bijvoorbeeld dan kun je niet '123' gebruiken.
Maar de discussie gaat erover dat die 123 dus een variabele is. Als je dan geen
single-quotes (') gebruikt dan kun je makkelijk twee queries van die enkele query maken wat dus niet de bedoeling is.
Als je het heel strikt bekijkt moet je 123 gebruiken en geen '123' alleen maakt het volgens mij niets uit. Wil je iets bij dat getal optellen bijvoorbeeld dan kun je niet '123' gebruiken.
Maar de discussie gaat erover dat die 123 dus een variabele is. Als je dan geen
single-quotes (') gebruikt dan kun je makkelijk twee queries van die enkele query maken wat dus niet de bedoeling is.
als niemand de tabellen weet is natuurlijk perfect, maar iemand kan na een paar pogingen atlijd je tabel goed hebben gegokt.. veiliger is om het gewoon niet mogelijk te maken ;-)
Arend schreef op 02.11.2006 20:18
Ik vond vooral je PDFje interessant, misschien is het aardig om die ook integraal op te nemen in je tutorial?
Ik weet niet wat je hier mee precies bedoelt (kan aan mijn dyslexie liggen) maar kan je je zlef nog verklaren of niet?
Arend schreef op 02.11.2006 20:18
Ik vond vooral je PDFje interessant, misschien is het aardig om die ook integraal op te nemen in je tutorial?
Ik weet niet wat je hier mee precies bedoelt (kan aan mijn dyslexie liggen) maar kan je je zlef nog verklaren of niet?
@Niek:
http://www.gkvwijnjewoude.nl/schoolhack3.pdf
@Andries Louw W.:
Bij id,s doe ik dat inderdaad ook altijd in combinatie met empty.
http://www.gkvwijnjewoude.nl/schoolhack3.pdf
@Andries Louw W.:
Bij id,s doe ik dat inderdaad ook altijd in combinatie met empty.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?
$id = 3432423;
if( !empty($id) && ctype_digit((string)$id) )
{
# $id is een getal van 1 t/m heel veel.
}
?>
$id = 3432423;
if( !empty($id) && ctype_digit((string)$id) )
{
# $id is een getal van 1 t/m heel veel.
}
?>
Wanneer je in PostgreSQL met PL/pgSQL aan de slag gaat, daarmee gaat programeren en vervolgens iedereen de toegang tot de tabelen ontzegt, kun je SQL-injection helemaal voorkomen. Er is geen mens die de database in kan, men kan alleen van de API's gebruik maken die jij hebt geprogrameerd. En voor alle API's geldt dat jij bepaalt hoe de input en output er uit zal zien. Alles wat daar van afwijkt, laat je door de API afkeuren. Dit is vele malen veiliger dan dat met MySQL-mogelijk is, die kent dit soort oplossingen helemaal niet. Oracle heeft soortgelijke oplossingen als PostgreSQL, PL/SQL.
@Martijn: Ik heb het over server programming en dan met name over PL/pgSQL. Zie http://www.postgresql.org/docs/8.1/interactive/server-programming.html en http://www.postgresql.org/docs/8.1/interactive/plpgsql.html
Ik ben niet goed bekend met de stored procedures van MySQL (vanaf versie 5), maar wellicht kun je daar soortgelijke resultaten mee bereiken. Alleen jammer dat MySQL al wel met de volgende waarschuwing komt: "Use of stored routines can cause replication problems.". Dat zijn problemen die je koste wat het kost probeert te vermijden!
Ik ben niet goed bekend met de stored procedures van MySQL (vanaf versie 5), maar wellicht kun je daar soortgelijke resultaten mee bereiken. Alleen jammer dat MySQL al wel met de volgende waarschuwing komt: "Use of stored routines can cause replication problems.". Dat zijn problemen die je koste wat het kost probeert te vermijden!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function quote_smart($value){
// Stripslashes
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if (!is_numeric($value)){
$value = mysql_real_escape_string($value);
}
return $value;
}
?>
function quote_smart($value){
// Stripslashes
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if (!is_numeric($value)){
$value = mysql_real_escape_string($value);
}
return $value;
}
?>
Dit is ook een handige functie voordat je strings in de sql query zet, om ze te beveiligen tegen SQL injection.
Zo komen ze altijd goed in de database, en hoef je ook geen stripslahes te gebruiken.
Stripslashes hoef je namelijk alleen te gebruiken als magic_quotes_gpc aan staat. Als magic_quotes_gpc aan staat en je doet dan nog eens mysql_real_escape_string() of addslashes() eroverheen wordt hij 2 keer ge slashed. (\\')
die laatste check hoeft er tog niet in? want als het een getal is wort ie tog automatisch niet geslashed.. dus gewoon zo tog?:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
function dinges($value) {
if(get_magic_quotes_gpc()) {
$value = strip_slashes($value);
}
return mysql_real_escape_string($value);
}
?>
function dinges($value) {
if(get_magic_quotes_gpc()) {
$value = strip_slashes($value);
}
return mysql_real_escape_string($value);
}
?>
@Huib: Wat probeer je hier mee te zeggen? Dat men er dus geen aandacht meer aan hoeft te besteden? Het is juist voor beginners, minstens 80% van de bezoekers van www.phphulp.nl , belangrijk dat hier tijd aan wordt besteed zodat zij ook veilige websites kunnen bouwen.
Om te reageren heb je een account nodig en je moet ingelogd zijn.
- Details
Door:
Niek s- 7 jaar geleden
- 10.074 x bekeken
- Labels
- Geen tags toegevoegd.
- PHP tutorials opties
- Overig
- Nieuwste PHP tutorials
- PHP tutorial toevoegen


PHP hulp
0 seconden vanaf nu