Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Centraal MySQL query variables escapen.

Pagina: 1
Acties:

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 20:29
Tijdens een kleine review van een stuk code door mij gemaakt is het escapen van variablen in MySQL queries ter sprake gekomen. Momenteel wordt in mijn code op elke moment dat een query gevormd word variablen ge-escaped.

Degeen die de code gereviewed heeft had het er over dat dit beter op een centraal punt kan gebeuren, echter zonder technisch uitleg of iets dergelijks (accountants ;( )

Ik heb er over zitten te denken hoe ik 'centraal' query variablen moet escapen. Maar ik kan met niets zinnigs komen waarbij ik escape calls weghaal en 1 weg zet voor waar de query uiteindelijk word uitgevoerd. (Er is bv wel een centrale functie om MySQL errors op te vangen)

Kan iemand hier wat meer over uitleggen?

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


  • user109731
  • Registratie: Maart 2004
  • Niet online
Misschien bedoelt hij dat je de query maakt met daarin placeholders voor de in te vullen waarden. Vervolgens geef je de query en de variabelen mee aan een functie die netjes alle waarden vervangt door de (escaped) variabelen en de query uitvoert...

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Wat heeft een accountant met jouw code te maken? Ik denk dat je een consultant de schuld wil geven?

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


  • Macros
  • Registratie: Februari 2000
  • Laatst online: 29-10 20:56

Macros

I'm watching...

Moet je je queries niet gewoon parametriseren? Dan worden de variabelen automatisch door de driver geëscaped. Ik neem aan dat je php gebruikt?

"Beauty is the ultimate defence against complexity." David Gelernter


  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 20:29
de code is in perl geschreven

Ik heb een database module geschreven welke het voor me zelf wat makkelijker te maken. Verder te noemen $db

$db heeft een subroutine die een query als string neemt en deze naar de DBI:mysql driver stuurt.. Hier gebeurd ook alle standaard check (is de database handle actief, fouten opvangen e.d.)

Elke keer wanneer ik een query ergens maak, maak ik deze als volgt:

$query = sprintf("SELECT * FROM `table` WHERE `text_fld` = %s AND `int_fld` = %d", $db->quote_string($txt), $int);

quote_string is de escape functie, deze doet niet meer dan het invoken van 'quote' op de database handle.

Dit alles leek mij een goede manier, zeker mbt mysql injections. Het tegenargument was, dat je dit maar 1x hoeft te vergeten om een injection flaw te hebben. Mijn argument was dat je gewoon goed moest programeren, maar dat was niet goed genoeg.

Het is echt een accountant welke deze review gedaan heeft (Het was geen audit, het was alleen gezien tijdens een kleine 'show' van de broncode van een applicatie)

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 16:28

TeeDee

CQB 241

Als je toch een DB module hebt, waarom dan niet daar de escape logica plaatsen?

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


Verwijderd

Keiichi schreef op vrijdag 28 maart 2008 @ 09:41:
[...]

Dit alles leek mij een goede manier, zeker mbt mysql injections. Het tegenargument was, dat je dit maar 1x hoeft te vergeten om een injection flaw te hebben. Mijn argument was dat je gewoon goed moest programeren, maar dat was niet goed genoeg.
Dat is vreemd. Ik kan namelijk geen situatie verzinnen waarin een fout in een programma geen gevolgen heeft voor de veiligheid ervan.

Als ik jou was, zou ik de accountant om opheldering vragen. Als hij geen oplossing heeft, lult hij maar wat in de ruimte. Heeft hij wel een oplossing, laat het hier dan weten, we zijn zeer benieuwd!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:20

Janoz

Moderator Devschuur®

!litemod

Je wilt het misschien niet horen, maar imho heeft de accountant wel gelijk. Misschien is het een idee om eens naar geparameteriseerde queries te kijken. Geen idee of dit beschikbaar is in perl, maar in veel andere talen heb je dit wel. Verder is dit niet heel lastig zelf te implementeren wanneer je al een database module hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 20:29
Ik kan er verder mee nu.

Een voorbeeldje die ik gezien heb is:

$sth = $dbh->prepare("SELECT email, userid FROM members WHERE email = ?;");
$sth->execute($email);

Dit zou de truc moeten klaren.
Janoz schreef op vrijdag 28 maart 2008 @ 09:49:
Je wilt het misschien niet horen, maar imho heeft de accountant wel gelijk. Misschien is het een idee om eens naar geparameteriseerde queries te kijken.
Ik heb nooit gezegd dat de accountant geen gelijk had. Als ik dacht dat ie zeker te weten ongelijk was, dan had ik nooit de vraag hier gesteld ;)

[ Voor 50% gewijzigd door Keiichi op 28-03-2008 10:03 ]

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/

Pagina: 1