login  Naam:   Wachtwoord: 
Registreer je!
 Forum

SQL Injection beveiliging, wat wel en wat niet

Offline Duikboot - 10/11/2009 15:07 (laatste wijziging 10/11/2009 15:33)
Avatar van DuikbootGrafische gevorderde Ik heb me de laatste tijd eens verdiept in wat een SQL injection eigenlijk is. Als je er wat meer van weet is het inderdaad wel vrij makkelijk om zo op een "beveiligde" pagina te komen of iemand z'n site compleet aan stront te helpen. Maar nu kom ik verschillende dingen tegen.

De functie mysql_real_escape_string() zou de ingevoerde $_POST[username] (o.i.d) checken.

Moet ik dat in dat geval dan ook voor het ingevoerde wachtwoord doen of maakt dat niet uit in dat geval?

De functie is_numeric() gaat volgens mij na of het ingevoerde/opgehaalde data slechts bestaat uit getallen, dus als je die gebruikt i.c.m mysql_real_escape_string ben je dus zo goed als beveiligd tegen de injections?

Verder kwam ik nog dit topic tegen:
http://www.site...eveiliging

Daar word een soort van functie genoemd in de laatste post. Is dat beter/makkelijker of maakt dat niet uit?

En ik kwam ook tussen de zoekresultaten nog tegen htmlentities(), maar wat die nou precies met SQL Injections te maken had, nog niet helemaal duidelijk...

Iemand die me hier wat verder mee kan helpen want er staan aardig wat bomen voor het bos...

17 antwoorden

Gesponsorde links
Offline ArieMedia - 10/11/2009 15:10
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Ook hier heb ik een tekstje over geschreven een poos terug.

SQL-Injectie

Omdat ik bezig ben met de nieuwe versie van mijn site zou je mij feedback kunnen sturen mbt de leesbaarheid van tekst en de inhoud van het artikel?
Offline Duikboot - 10/11/2009 15:13
Avatar van Duikboot Grafische gevorderde Met die ben ik ook begonnen, daar heb ik de eerste 2 functies om te beveiligen ook vandaan  . Dus bij deze keur ik je artikeltje goed.

Maar als je verder gaat kijken op het web kom je nog tig andere functies/scriptjes tegen om de zaak te beveilingen. Dus ik vroeg me af wat er nu anders is aan die 2 easy as simple functies in je coding verwerken, of bijvoorbeeld dat ene scriptje uit het topic wat ik in de OP genoemd heb...
Offline Ontani - 10/11/2009 15:14 (laatste wijziging 10/11/2009 15:15)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
het Voute voorbeeld?
Offline ArieMedia - 10/11/2009 15:16 (laatste wijziging 10/11/2009 15:19)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Ontani schreef:
het Voute voorbeeld?
woordgrapje 

@Duikboot, over het algemeen is dit goed, maar je kan bijvoorbeeld een integer ook anders gaan gebruiken door het te forceren als integer

  1. if(isset($_POST['submit'])) {
  2. $iID = (int) $_POST['id'];
  3. $sql = 'SELECT de, hele, riedel FROM iets WHERE product = '.$iID;
  4. // enzovoorts
  5. }
Offline Duikboot - 10/11/2009 15:37
Avatar van Duikboot Grafische gevorderde Ik veronderstel dan dat de functie die je hierboven noemt beter is? Omdat is_numeric() "over het algemeen" wel goed is. Of maakt dat vrij weinig uit?

En i.p.v $_POST kan ik ook zonder problemen een $_GET neerzetten op het moment dat het niet in de db gaat, maar eruit word gehaald? Omdat ik dat geval ook de database aangeroepen word.
Offline ArieMedia - 10/11/2009 16:03 (laatste wijziging 10/11/2009 16:04)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Duikboot schreef:
Ik veronderstel dan dat de functie die je hierboven noemt beter is? Omdat is_numeric() "over het algemeen" wel goed is. Of maakt dat vrij weinig uit?

En i.p.v $_POST kan ik ook zonder problemen een $_GET neerzetten op het moment dat het niet in de db gaat, maar eruit word gehaald? Omdat ik dat geval ook de database aangeroepen word.
ik vind is_numeric persoonlijk beter, omdat je hier controleert of het een nummer is, het verschil is dat het je bij de 1 controleert of het ingegeven getal een nummer is en bij de methode die ik hier boven gaf dat je forceert dat het een getal word!

Wil je 1000% zekerheid dat het goed gaat dan pak je gewoon beide controles (maar dit is soms een beetje overbodig?)

  1. if(is_numeric($_POST['id'])) {
  2. $iID = (int) $_POST['id'];
  3. }


een Post/get is altijd een string (ook al staat er een getal in). Nu controleer je of de post een getal is, en daarna zet je hem om naar een integer.

of dit zo zwaar nodig is? ik betwijfel het.. nog nooit een website op gezet waar je te maken hebt met een ultra sterke beveiliging.
Offline Duikboot - 10/11/2009 16:34 (laatste wijziging 10/11/2009 16:44)
Avatar van Duikboot Grafische gevorderde Met die 2 functies is het dus mogelijk om een gemiddelde site te beveiligen tegen een SQL injection. Mooi dan weet ik dat 

Oja, ik heb bij het registreren een functie die checkt of de opgegeven username bestaat uit letters, cijfers en een laag of liggend streepje. Ik neem aan dat die functie dus de rest van de tekens niet toelaat?

EDIT: De functie hiervoor heb ik uit een ledenscript gehaald die hier tussen de scripts staat.

  1. <?
  2. if(!preg_match("/^[-_0-9a-z]{2,}$/i", $_POST['username'])) {
  3. echo "Je gebruikt tekens die niet zijn toegestaan";
  4. }
  5. ?>
Offline ArieMedia - 10/11/2009 16:37 (laatste wijziging 10/11/2009 16:37)
Avatar van ArieMedia Gouden medaille

PHP ver gevorderde
Duikboot schreef:
Met die 2 functies is het dus mogelijk om een gemiddelde site te beveiligen tegen een SQL injection. Mooi dan weet ik dat 

Oja, ik heb bij het registreren een functie die checkt of de opgegeven username bestaat uit letters, cijfers en een laag of liggend streepje. Ik neem aan dat die functie dus de rest van de tekens niet toelaat?
geen flauw idee, ik heb geen paranormale krachten dat ik vanaf hier in jou code kan kijken, maar zulke dingen zijn zelf ook gemakkelijk te controleren door gebruikersnamen op te geven die nergens op slaan.
Offline henver - 10/11/2009 16:47 (laatste wijziging 10/11/2009 16:49)
Avatar van henver HTML gevorderde PHP.net: ctype_digit is beter dan PHP.net: is_numeric omdat PHP.net: ctype_digit enkel en alleen nummers mag bevatten.
PHP.net: is_numeric accepteert o.a. ook komma's (.), machten (^) en machten van 10 (E).

Zo geeft
  1. ctype_digit(3000.5) // false
  2. is_numeric(3000.5) //true
  3.  
  4. ctype_digit(2^2) // false
  5. is_numeric(2^2) // true
  6.  
  7. ctype_digit(2E2) // false
  8. is_numeric(2E2) //true
  9.  
  10. ctype_digit(15) // true
  11. is_numeric(15) // true
Offline Duikboot - 10/11/2009 16:55 (laatste wijziging 10/11/2009 16:58)
Avatar van Duikboot Grafische gevorderde Ah kijk, bedankt!

Ik gebruik toch alleen hele getallen dus die kan ik goed gebruiken  .
Offline Joost - 10/11/2009 17:06
Avatar van Joost PHP expert
henver schreef:
PHP.net: ctype_digit is beter dan PHP.net: is_numeric omdat PHP.net: ctype_digit enkel en alleen nummers mag bevatten.
PHP.net: is_numeric accepteert o.a. ook komma's (.), machten (^) en machten van 10 (E).

Zo geeft[..code..]
Niet helemaal,

geeft ook false. ctype functies returnen alleen true als het ook strings zijn. Post- en getdata worden ook als strings doorgegeven, dat scheelt dan weer 
Offline Richard - 10/11/2009 20:35
Avatar van Richard Crew algemeen En daarom doe je altijd ctype_digit((string)$waarde); :-)
Offline Duikboot - 11/11/2009 00:38
Avatar van Duikboot Grafische gevorderde Neem aan dat mysql_real_escape_string() ook werkt als je er de inhoud van een textveld doorheen haalt?

Dus als je het echt vrij veilig voor elkaar wilt hebben haal je, zodra je iets in de database stopt de inhoud van je <input> even door zo'n functie of zie ik dat verkeerd?
Offline kurohyou - 11/11/2009 03:16 (laatste wijziging 11/11/2009 03:17)
Avatar van kurohyou Oud lid Een beter en veiliger voorbeeld is om gebruik te maken van de vernieuwde mysqli extensie en prepared statements die php bied.
  1. $mysqli = new mysqli('localhost', 'username', 'password', 'database');
  2. $stmt = $mysqli->prepare("INSERT INTO table_name VALUES (?, ?)");
  3. $stmt->bind_param('si', $column1, $column2);
  4. $column1 = 'something';
  5. $column2 = '3';
  6. $stmt->execute();
  7. $stmt->close();
Offline Duikboot - 12/11/2009 15:01
Avatar van Duikboot Grafische gevorderde En hoe gaat dat in z'n werk?

Maar als ik dus de dingen controleer die de database ingaan, en de cookies die ik geset heb (voor het geval ze daar mee rotzooien), dan moet het in principe goed gaan? Grofweg gezegd dan  
Offline marten - 12/11/2009 16:15
Avatar van marten Beheerder Grofweg gezegd controleer je alles wat er ingaat op alle mogelijke manieren of het is wat jij wilt dat er in gaat.

Even zo voor alles wat er uitgaat
Offline Duikboot - 12/11/2009 16:56 (laatste wijziging 12/11/2009 16:57)
Avatar van Duikboot Grafische gevorderde Ben een jaartje of 2 afwezig geweest uit het scriptcircuit, dus:
  1. <?
  2. //username uit textveld
  3. $username = "pietje";
  4. $usernamecheck = mysql_real_escape_string($username);
  5.  
  6. // in database zetten etc.
  7. ?>


Zo is dan de manier om het toe te passen? In dit geval een username, maar ook voor een forumpost, comments onder foto's etc.

En in het geval van bijv. een rij/userprofiel ophalen uit de DB met bijv. ID 1,
  1. <?
  2. $id = $_GET[id];
  3. if(is_numeric($id)){
  4. // rijen ophalen
  5. }
  6. else{
  7. // geen getal, dus niks doen
  8. }
  9. ?>
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.261s