sql lekérdezések logolása
Hello!
Valaki meg tudná nekem mondani, hogy hogy lehet SQL lekérdezéseket adatbázisba logolni anélkül, hogy alkérésként értelmezné a mysql?
Például, ha egy input-mezőből jön befele egy adat, még ellenőrzés után is maradhat benne olyan adat, amit az sql (később, az eredeti lekérdezésbe beszúrva) alkérésként értelmezhet, és így kész is a gyönyörű sql-injection. Keressem végig a szövegben az összes mysql-kulcsszót?
nazgul[dot]mail[at]freemail.hu
■ Valaki meg tudná nekem mondani, hogy hogy lehet SQL lekérdezéseket adatbázisba logolni anélkül, hogy alkérésként értelmezné a mysql?
Például, ha egy input-mezőből jön befele egy adat, még ellenőrzés után is maradhat benne olyan adat, amit az sql (később, az eredeti lekérdezésbe beszúrva) alkérésként értelmezhet, és így kész is a gyönyörű sql-injection. Keressem végig a szövegben az összes mysql-kulcsszót?
nazgul[dot]mail[at]freemail.hu
re
http://shiflett.org/articles/security-corner-apr2004
másodszorra, keresés egy erre készült létező class után, és használása
http://cyberai.users.phpclasses.org/browse/package/2189.html
üdv t
megnéztem
Sajnos nem lettem okosabb. Régóta foglalkozok az sql-injection kivédésével, megvannak a saját függvényeim erre, de hogy nézne ki, hogy kiszűröm az ártó kódot és adatb.-be logolom, ami kb. ugyanolyan, mintha ellenőrzés nélkül elküldtem volna az sql-nek...
A class nem az sql kódot szűri, hanem a html/php/js kódot. Nekem olyan függvényre/osztályra lenne szükségem, ami az sql kulcsszavakat szúrja ki egy sztringben.
...
De jó lenne
XSS vs SQL injection
Ne keverd össze az XSS-t és az SQL injectiont. Az ajánlott osztály az előbbi elleni védekezésre szolgál, és noha "input"-ot védjük, mégis tipikusan megjelenítéskor kell rá nagyon odafigyelni, mert az input az elég sokrétű lehet.
Eredeti kérdésre: simán a mysql_real_escape_string milyért ne lenne jó erre a célra is?
Felhő
hát?
egy tipp
Én csináltam már hasonlót.
1. Az adatbázis kapcsolódás után SHOW TABLES -al kiolvasom a táblaneveket, egy regex-el átalakítom azokat így: 'users' -> 'uxsers'. Ezeket beteszem egy tömbbe.
2. Szintén tömbbe teszem a kritikusnak tartott sql parancsokat: drop, delete, truncate... normál és átalakított formában is.
3. Minden queryt egy függvényben hajtok végre. Ebben egyszerűen lecserélem a 'users' szövegrészeket a módosított formára. Így kapja meg az sql, ha valamilyen módon mégis átjátsszák az előtte levő védelmeket (pl. \' ) akkor is pl. ezt kapja az sql: '... dxrop uxsers ...'
4. Kiolvasást szintén fv-en keresztül végzek, ahol megcsinálom a visszaalakítást - így az oldalon már az eredeti szöveg lesz (pl. egy fórum hozzászólásnál, ahol egy beküldött kód tartalmazza a fentebb példázott stringet.
Mivel az adatbáziskezelés külön saját függvénytáron keresztül történik, az egész nem olyan macerás, mint elsőre tűnik.
jaja
Nekem speciál még nem sikerült bizonyítani, hogy alapvető karaktererkkel ([:space:]a-zA-Z0-9.,:@_-éáőúöüóűíÉÁŐÚÖÜÓŰÍ) lehet-e sql-injekciót végrehajtani.
Szerintem az aposztróf hiánya például alaposan megcsappantja a lehetőségeket.
Majd rátesztelek, ha lesz egy kis időm...
nemtom...
Másolhatnál ide majd néhány félelmetes és gonosz, időn és téren túl lévő, SQL-be oltott cuccot, ami eszképelés és a fent írt ellenőrzési módszerek futtatása után még benne maradhat a kódban. Kíváncsian várom. Köszi!
hát mégse...
Annyit hallottam már erről, de soha nem láttam még egyetlen működőt sem, amivel ártani lehetett volna. Megesz a kíváncsiság, de komolyan. :)
Cikk
nem tanács, csak ötlet
aposztróf hiánya alaposan megcsappantja a lehetőségeket
Ez így van. A leírt módszer segíthet előre nem látott, vagy a későbbi fejlesztés során bekerülő bug semlegesítésében.
A magam részéről nem tanácsot, csak ötletet akartam adni. Tetszés szerint megfogadható/elvethető - ízlés dolga.
nem kevertem új fícsőr az input filter-ben
üdv t :)
ok, nem derült ki
o ideológia: szerintem hibás az a módszer, hogy a bejövő inputot egyszerűen megváltoztatjuk, és utána úgy használjuk. Ha nem jó az input, akkor dobjuk vissza a felhasználónak, jelezzük egyértelműen a hibát, és majd ő eldönti, hogy mit is szeretne (a kedvére persze lehet tenni, gombnyomásra szűrjük a HTML tageket vagy bármi)
o programozás technika: az általános input filter funkcióban ott van egy tök speciális, csak MySQL esetén működő escapelés.
o megvalósítás: kisebbik baj, hogy fogalma sincs róla, hogy mi az, hogy statikus metódus (példában használja, közben a függvényben ott a $this kulcsszó), de az már nagyon gáz, hogy magát az escapelő függvényeket rosszul használja, tehát épp csak a feladatát nem látja el.
Persze mindenki azt használ, amit csak szeretne. :)
Felhő
én
http://shiflett.org/articles/security-corner-apr2004 -t viszont elolvastam, ill. az (IN)SECURE-ban is ISSUE 1.6 (March 2006) volt egy cikk (PHP and SQL security today), azt is
http://www.insecuremag.com/archive.html
üdv t
statkus metódus miaz
statikus attrib-ot ismerem pear-ből, statikus metódust meg js-ből :)
első ugye ilyesmi
javascriptben, meg mittmén
üdv t
ja vagy a Scope Resolution Operator -ra tesztik gondolni :) ( http://www.php.net/manual/en/keyword.paamayim-nekudotayim.php ) magyarán a példányosítás nélküli class-okra ? [think]
re: statkus metódus miaz
Mit szerettél volna elérni ezzel a példával?
Nyomj rá egy var_dumpot! ;)
A statikus metódus (a statikus tagváltozóhoz hasonlóan) ideológiailag abban különbözik egy mezitlábas metódustól, hogy egy olyan viselkedést valósít meg, ami nem egy konkrét példányhoz tartozik, hanem magához az osztályhoz. Tipikus könyv példa, hogy szeretnénk nyilvántartani, hogy adott osztályból hány példányt hozunk létre. Technikailag ez azt jelenti, hogy a statikus metódusban nem szerepelhet a $this kulcsszó. PHP4-ben nincs kifejezetten statikus metódus (PHP5-ben már ott a static kulcsszó), vagy attribútum. Itt egy metódus akkor tekinthető statikusnak, ha nem szerepel benne a $this, és ilyenkor lehet az Általad is említett :: operátorral meghívni. Statikus attribútumot pedig csak trükközéssel lehet elérni PHP4-ben:
Itt szintén nem értem, hogy mit szerettél volna bemutatni a példával. JavaScript esetén nem is igazán van értelme statikus metódusról beszélni, itt a this-t nem használó függvények egy osztályon belül kb. csak azért vannak, hogy egy namespace-be legyenek zárva, mint mondjuk a prototype Event.observe() függvénye, lehetne nyugodtan Event_observe is.
Felhő
azt
mire nyomjak vardumpot ? (nem kötözködök most már érdekel :) ) megkerestem pear-ben is
http://pear.php.net/manual/hu/core.pear.pear.getstaticproperty.php
erről van szó, ott a példa
üdv t
re: azt
Arra akartam utalni, hogy a példádban a statikus változó nem része az osztálynak, ezért nincs is túl sok értelme, simán egy globális tömbe is pakolhatnád abban a megközelítésben.
Nem is annak fogtam föl, látom, hogy Téged érdekelnek a felszín alatti dolgok is.
http://pear.php.net/manual/hu/core.pear.pear.getstaticproperty.php
erről van szó, ott a példa
Hát ebből is az derül ki, hogy a PEAR-ben a sok értékes dolog mellett van sok olyan, ami nem az. Kb. ugyanez a baja a PEAR mgközelítésnek is, mint a Te példádnak, az osztályon kívül vannak tárolva a "statikus" változók.
Ha megnézed az én példámat, akkor a következő példából látni fogod a megközelítés beli különbséget. A statikus változók ténylegesen az adott osztályhoz fognak tartozni, egy adott osztályból nem éred el egy másik osztály statikus tagváltozóját. Plusz szerintem az általam nyújtott interface is szebb, mint a PEAR-é, azt hiszem, hogy be is fogom küldeni nekik ezt a megvalósítást.
kössz
http://pear.php.net/manual/en/package.database.db-dataobject.intro-purpose.php
alult a Example 33-4. At last some real DataObject Code.. -nál a konfigurációs adatok kerülnek be a fenti módszerrel statikus attrib-nak
$options = &PEAR::getStaticProperty('DB_DataObject','options');
// the simple examples use parse_ini_file, which is fast and efficient.
// however you could as easily use wddx, xml or your own configuration array.
$config = parse_ini_file('example.ini',TRUE);
// because PEAR::getstaticProperty was called with and & (get by reference)
// this will actually set the variable inside that method (a quasi static variable)
$options = $config['DB_DataObject'];
a pear-en lévő cuccokat se merem krtitzálni, de ha benn van a base class-ban , háát [think]
üdv t
azért mert PEAR...
Azért mert a PEAR-ben van egy megoldás, az nem feltétlenül jelenti azt, hogy az a legjobb megoldás. Ha megnézed annak a kódnak a használati eseteit, akkor az enyém biztosítja azt a funkcionalitást (egyszerűbben), plusz a ebben a helyén vannak a dolgok (tisztább, szárazabb érzés). Bedobtam PEAR dev listára is, ha van vele valami gond, akkor ki fog derülni.
Felhő
PEAR válasz
Felhő
ahha, de nem volt meglepő
üdv t
ui: bocsánat hogy csak 'little discussion'-ra tellik tőlem :) (de ebben az évben a javscript-re ill a prototype-ra izgultam rá, és holnaptól a YUI-ra:)) )
re: ahha, de nem volt meglepő
Felhő
u.i.: YUI nagyon jónak, és használhatónak tűnik, pl. eseménykezelése jóval fejlettebb, mint a prototype-é. Érdekes tapasztalat lesz, hogy hogyan lehet/érdemes a kettőt együtt használni.
natív tipúsként használni