[PHP & Mysql] mysql injection tegengaan

Pagina: 1
Acties:
  • 1.308 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
Ik heb klein onderzoekje gedaan naar mysql injections.
Ik begrijp al een gedeelte wat het betekend en waarom het belangrijk is om dit tegen te gaan.
Zo ver ik er uit kan maken kan je met mysql injections b.v. gegevens uit een database verwijderen en nog meer.

Ik heb een klein stukje geschreven maar werkt nog niet perfect.
Mijn leraar zeg dat ik er niet aan hoef te denken en gewoon plain in de mysql moet zetten.
En dat ik niet aan mysql injection moet denken tot het pas gebeurt.
Ik zelf vindt dat ik nu al gelijk moet proberen te beveilingen en al te voorkomen voor het gebeurt.

in mijn index pagina heb ik de volgende functie aangemaakt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
//Funcie voor mysql injection tegen te gaan
function quote_smart($value) {
   // Stripslashes
   if (get_magic_quotes_gpc()) {
       $value = stripslashes($value);
   }
   //Controleer of query geen nummeriek is
   if (!is_numeric($value)) {
       $value = mysql_real_escape_string($value);
   }
   return $value;
}

Dit moet er voor zorgen dat mysql injecties vrij ver worden tegen gehouden.

Als ik dan die functie over de $_POST waarde doe en echo dat laat die het goed zien.
Maar in de database doet die het niet goed weergeven.

$voornaam = quote_smart($_POST['vnaam']);

Als ik echo dan zeg die b.v. - test\'test\'
Zoals je ziet echo hij het goed.

Maar als ik in mijn database kijk staat er test'test'
Volgens mij klopt dat niet en moet die gewoon met een \ er bij.

mijn query:
$query = "UPDATE gebruikers SET Voornaam = '$voornaam' WHERE Gebruikersnaam = '$gebruiker'";
mysql_query($query);

als ik $voornaam = mysql_real_escapes($_POST['voornaam']); doe dan zet die wel test\'test\' in de database.

wie weet wat het probleem kan zijn?

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 00:41

TeeDee

CQB 241

vitrix schreef op woensdag 07 februari 2007 @ 17:06:
Mijn leraar zeg dat ik er niet aan hoef te denken en gewoon plain in de mysql moet zetten.
En dat ik niet aan mysql injection moet denken tot het pas gebeurt.
Dan vind ik dat je leraar per direct moet stoppen met lesgeven. Wat een idiote opmerking/bewering. Aan injection denken als het gebeurt. Dat houdt dus in dat jij al je data kwijt kan zijn.
Ik zelf vindt dat ik nu al gelijk moet proberen te beveilingen en al te voorkomen voor het gebeurt.
Juist.

Maar, waarom denk jij dat test'test' niet goed is? Dat is toch juist de hele truuk van het escapen?

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • vitrix
  • Registratie: Januari 2006
  • Laatst online: 23-08-2021
oke ik dacht dat \ er ook in zou komen te staan.
Maar dat het zonder \ in de database komt te staan is dus gewoon goed.
ik had al op diverse sites gekeken maar die deden precies het zelfde als wat ik deed.
Ben ik blij dacht al dat ik niets fout had gedaan.
Tnx voor jullie hulp en tnx voor die links is handig en komen goed van pas op mijn onderzoekje.

Die leraar heeft vaker rare opmerkingen waarvan ik denk dat klopt niet.

[ Voor 22% gewijzigd door vitrix op 07-02-2007 18:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Mijn leraar zeg dat ik er niet aan hoef te denken en gewoon plain in de mysql moet zetten.
En dat ik niet aan mysql injection moet denken tot het pas gebeurt.
C++:
1
delete leraar;

Weg met garbage ^-^

[ Voor 5% gewijzigd door Verwijderd op 07-02-2007 19:52 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Misschien is het een idee om in plaats van een specifieke $_POST door die functie heen te gooien, een recursieve functie schrijven, waarin je de gehele $_POST en $_GET array doorloopt en alle waarden, inclusief subarrays doorloopt. Dan kan je een check doen op elke string.

Vergeet niet dat wanneer $value een boolean is, je er ook mysql_real_escape_string() overheen doet. Je kan denk ik voor de netheid beter kijken of je value wel een string is, in plaats ervan uit te gaan dat !is_numeric een string is.

Verder is het denk ik gewoon nuttig om de SQL Injection te lezen op php.net, als je dat nog niet hebt gedaan :)

En inderdaad, die leraar :X |:( * mithras geen woorden er voor heeft

[ Voor 5% gewijzigd door mithras op 07-02-2007 19:54 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Heeft je leraar een website die gebruikt maakt van SQL? :+ (zonder magic quotes aan :P)

Maar in ieder geval, ik heb op de onderstaande pagina een klein voorbeeldje van hoe SQL Injection werkt. Mischien kan het wel eens handig zijn :)
SQL Injection tutorial(tje)

Mischien je leraar het ook laten lezen? :9

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 00:12
Ik vind je functie in deze vorm niet heel erg handig. Je gaat er nu vanuit dat je gegevens altijd uit een van de request-parameters (Get Post Cookie) komen. Voor gegevens die je ergens anders vandaan haalt is de functie niet bruikbaar omdat je er door de stripslashes mogelijk bedoelde slashes uithaalt. Bij het opstellen van queries krijg je nu dus een situatie waarin je sommige gegevens met mysql_real_escape_string() gaat escapen en andere waarden met deze smart_quote() functie. Ik vind dat er niet duidelijker opworden.

Zelf strip ik - zoals Mithras voorstelt - slashes altijd bij initialisatie (als magic_quotes aanstaat). Dan heb je in je hele script altijd te maken met mysql-unsafe (en html-unsafe, en..) strings. Op het moment dat het nodig is kun je ze dan escapen. In geval van database queries zou ik voorts sprintf() aanraden zodat je expliciet types af kunt dwingen.

Regeren is vooruitschuiven

Pagina: 1