sql injection mogelijk?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robert -

Robert -

14/12/2006 21:49:00
Quote Anchor link
Ik bouw mijn site nu op door alle pagina's uit een database te laden.
De pagina's worden nu aangeroepen met bijv: www.mysite.com?id=2.
In dit geval zijn het alleen getallen, maar bij veel andere sites zie ik ook gewoon woorden.

Maar nu de uiteindelijke vraag.
Als ik dus nu de kijk of id een getal is en dan met sql de datbase uitlees is dan nog sql injection mogelijk?
 
PHP hulp

PHP hulp

28/11/2024 19:52:07
 
Michael -

Michael -

14/12/2006 21:54:00
Quote Anchor link
Als je checkt of $id een nummeriek getal is, zouden er nooit letters of tekens gebruikt kunnen worden, dus dan is het veilig.
Als je niet alleen nummerieke getallen wilt gebruiken moet je mysql_real_escape_string() over je $id halen als je daarmee wat uit je database haalt.
Beetje raar dat je alle pagina's in een db zet en daarna weeruit haalt om er een ID van te maken. Dit kan ook met een gewoon case scriptje.
 
Robert -

Robert -

15/12/2006 07:18:00
Quote Anchor link
ok ty dan komt het helemaal goed
 
CB2thephp

CB2thephp

15/12/2006 07:25:00
Quote Anchor link
Voordeel van de database is Turmi, is dat het velere malere overzichtelijker is. Bij een case scriptje is dat niet het geval (vind ik).
 
Jelle Posthuma

Jelle Posthuma

15/12/2006 09:07:00
Quote Anchor link
Ik gebruik vaak gewoon dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
//Toegestane paginas in array.
$allow_pages = array('home','page1','page2','page3','page4','page5');

//Kijken of de GET bestaat, en of ie in de array zit.
if(isset($_GET['page']) && in_array($_GET['page'],$allow_pages)){
    //Kijken of de file ook echt bestaat.
    if(file_exists("submap/".$_GET['page'].".php")){
        //Pagina includen
        include("submap/".$_GET['page'].".php");
    }
else{
        //Home pagina includen
        include("home.php");
    }
}
else{
    //Home pagina includen
    include("home.php");
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Jelle Posthuma
 
Arne De Herdt

Arne De Herdt

15/12/2006 09:33:00
Quote Anchor link
als je zeker wil zijn tegen SQL-injectie bouw je code dan zo op:

(php5 code)

if( isset($_GET['var']) {
if( is_numeric($_GET['var']) {
$var = $_GET['var'];
str_ireplace("DELETE","",$var);
str_ireplace("DROP","",$var);
str_ireplace("ALTER","",$var);
str_ireplace("GRANT","",$var);
str_ireplace("MODIFY","",$var);
str_ireplace("INSERT","",$var;
str_ireplace(";","",$var);
$QUERY = "SELECT x FROM y WHERE pageID='$var'";
}
}

Deze code zou je moeten beschermen tegen injecties. Tevens stript hij ook elk keyword nog eens uit je offset in de SQL
 
Jurgen assaasas

Jurgen assaasas

15/12/2006 09:40:00
Quote Anchor link
Dus als ik doe SELECT password FROM users zou dit wel werken... dus nog niet echt proof. je moet gewoon zorgen ongeacht de SQL syntax dat die niet uitgevoerd wordt.
 
Jelle Posthuma

Jelle Posthuma

15/12/2006 09:41:00
Quote Anchor link
Dat is inderdaad ook een optie..
 
Jan geen

Jan geen

15/12/2006 09:59:00
Quote Anchor link
ik doe meestal hetzelfde als jelle, een array met de pagina's die geladen mogen worden, daarna kijken of de $_GET in die array voorkomt. Dat is volgens mij wel veilig.
 
Michael -

Michael -

15/12/2006 10:01:00
Quote Anchor link
Arne De Herdt schreef op 15.12.2006 09:33:
als je zeker wil zijn tegen SQL-injectie bouw je code dan zo op:

(php5 code)

if( isset($_GET['var']) {
if( is_numeric($_GET['var']) {
$var = $_GET['var'];
str_ireplace("DELETE","",$var);
str_ireplace("DROP","",$var);
str_ireplace("ALTER","",$var);
str_ireplace("GRANT","",$var);
str_ireplace("MODIFY","",$var);
str_ireplace("INSERT","",$var;
str_ireplace(";","",$var);
$QUERY = "SELECT x FROM y WHERE pageID='$var'";
}
}

Deze code zou je moeten beschermen tegen injecties. Tevens stript hij ook elk keyword nog eens uit je offset in de SQL

als je gewoon mysql_real_escape_string() gebruikt is het niet nodig om die woorden DELETE, DROP etc eruit te vissen. en dat is niet waterdicht. Zie tutorials over Mysql Injection.
 
Frank -

Frank -

15/12/2006 11:56:00
Quote Anchor link
@Arne: Wanneer je eerst met is_numeric() controleert of een variabele TRUE is, dan heeft het weinig zin om vervolgens nog met str_replace() aan de slag te gaan. Je weet namelijk al 100% zeker dat DELETE, DROP, etc. niet in deze variabele aanwezig zal zijn. De variabele zou in dat geval namelijk een FALSE opleveren.

Kortom, een zinloos stukje code waar nooit iets zinvols mee wordt gedaan.

Overigens kun je beter ctype_digit() gebruiken i.p.v. is_numeric(), zie de handleiding voor de verschillen.

Edit: Waar zouden we zijn zonder Jan?
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Jan Koehoorn

Jan Koehoorn

15/12/2006 11:57:00
Quote Anchor link
@ Frank: is_numeric is met 1 m. Ik dacht eerst dat je een typfoutje maakte, maar je schrijft het twee keer met dubbel m in je post ;-)
 
Frank -

Frank -

15/12/2006 12:03:00
Quote Anchor link
@Jan: Zo af en toe ben ik uitermate consequent! Zelfs in mijn tikfouten...

Maar je hebt natuurlijk volkomen gelijk, het is met 1 m.
 
Jurgen assaasas

Jurgen assaasas

15/12/2006 12:10:00
Quote Anchor link
Dus het moraal van dit topic: Als je op ID checkt (dus nummeriek) gebruik ctype_digit(). Is_numeric() is een goede functie om te reken(bijv: 123,456) terwijl ctype_digit enkel hele getallen pakt(voor zover ik weet).

:)
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
 
Robert -

Robert -

15/12/2006 16:54:00
Quote Anchor link
Dus in dit geval moet ik gewoon controleren met ctype_digit()?
Maar als ik dan bijvoorbeeld toch met tekst wil zoals www.mysite.com?id=formular is dan mysql_real_escape_string() safe?
Gewijzigd op 01/01/1970 01:00:00 door Robert -
 
Jan Koehoorn

Jan Koehoorn

15/12/2006 16:59:00
Quote Anchor link
Klopt, en ook checken op toegestane strings. Als je bijvoorbeeld op die manier een pagina wilt includen, moet je een array maken met toegestane pagina's en met in_array checken of de string okee is. De gebruiker kan in de adresbalk invullen wat hij wil, dus je moet overal op checken.
 
Niek s

niek s

15/12/2006 17:19:00
Quote Anchor link
Arne De Herdt schreef op 15.12.2006 09:33:
als je zeker wil zijn tegen SQL-injectie bouw je code dan zo op:

(php5 code)

if( isset($_GET['var']) {
if( is_numeric($_GET['var']) {
$var = $_GET['var'];
str_ireplace("DELETE","",$var);
str_ireplace("DROP","",$var);
str_ireplace("ALTER","",$var);
str_ireplace("GRANT","",$var);
str_ireplace("MODIFY","",$var);
str_ireplace("INSERT","",$var;
str_ireplace(";","",$var);
$QUERY = "SELECT x FROM y WHERE pageID='$var'";
}
}

Deze code zou je moeten beschermen tegen injecties. Tevens stript hij ook elk keyword nog eens uit je offset in de SQL



Dat is echt on nodig!

Maar weer ontopic:

Als je met bijvoorbeeld is_numeric() checkt of iets een getal is, dan kan het alleen een getal zijn, en is er dus geen gevaar.
Kijk anders deze eventjes door: http://www.phphulp.nl/php/tutorials/3/444/
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

15/12/2006 19:04:00
Quote Anchor link
Ik prefereer ctype_digit() ver boven is_numeric().
Omdat is_numeric() ook waarden in de min accepteert, wat nou niet echt de bedoeling kan zijn.
 
Niek s

niek s

15/12/2006 20:09:00
Quote Anchor link
Andries Louw W. schreef op 15.12.2006 19:04:
Ik prefereer ctype_digit() ver boven is_numeric().
Omdat is_numeric() ook waarden in de min accepteert, wat nou niet echt de bedoeling kan zijn.


Heb je gelijk in, maar voor dit script is is_numeric ook genoeg denk ik.
 



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.