ugrás a tartalomhoz

SQL lekérést károsító hibák lekezelése

jeti · 2006. Júl. 6. (Cs), 17.17
Sziasztok!

Van egy táblám tele adatokkal. Az első mező (id) integer típusú, index és automatikusan nő az értéke új adatoknál. GET-es kérelem formájában megkapja a sorszámot (id-et), hogy mit jelenítsen meg. Ezzel csak akkor vagyok gondban, ha eljátszom az oldalt megbontó, rosszindulatú látogatót...
Mondjuk, kézzel azt írja be, hogy: index.php?valami=14h24
1. megoldás
 "SELECT * FROM tabla WHERE id=’".$valami."’" 
kimenet: megjelenik a 14. sor adatai
2. megoldás
 "SELECT * FROM tabla WHERE id=".$valami 
kimenet: Hiba! 1054: Unknown column '14h24' in 'where clause'
Ez persze a leegyszerűsített vázlat...

Mi lenne a legjobb megoldás?
Szűrjek meg minden egyes változót? 1054 hibához rendeljek egy olyan üzenet, mintha nem adatna vissza semmit se a lekérés?
Érdemes 4 fokozatú hibaüzenet rendszert bevezetni?
Jelenleg van: tájékoztató üzenet, hibaüzenet, kritikus hibaüzenet
Legyen-e: „hacker” üzenet (ez nem a program hibája és egy normális felhasználó sem tudna ilyet produkálni)
 
1

Ajánlás

Poetro · 2006. Júl. 6. (Cs), 17.26
Minden a felhasználótól érkező adatot szűrni kell. MINDIG
A felhasználói visszajelzések maradhatnak ugyan ilyen szintűek, ez jelen esetben a hibaüzenet kategóriába esik.
Képzeld el a következőt:
index.php?valami=14;DELETE FROM tabla WHERE 1
Ekkor ha nem teszel semmit az adataiddal az egész táblát szépen kiüríti a rosszindulatú felhasználó.
De tehetne mást is, ez csak egy példa volt. Például így olyan adatokhoz férhet hozzá, amit nem szeretnél publikussá tenni.
2

nem jó példa ;)

Hodicska Gergely · 2006. Júl. 7. (P), 00.01
Mysql kiterjesztés nem tud egyszerre több parancsot végrehajtani. Viszont ezzel együtt persze fontos a megfelelő védelem. Eredeti kérdezőnek: keress rá a php+security+sql+injection kombóra, és sok hasznos linket fogsz kapni.


Felhő
3

összes POST és GET változó ellenőrzése

jeti · 2006. Júl. 7. (P), 16.00
Köszönöm a segítséget.
( http://www.php.net/manual/hu/security.database.php Ez a link segítet a legtöbbet, ha másnak is szüksége lennem rá... Miért nem a manuállal kezdtem? :-) )

A POST-os változókat már régóta ellenőrzőm, de a GET-eseket nem olyan alaposan...
Az összes GET-es változót így a legegyszerűbb ellenőrizni?
$_GET['valami']
$HTTP_GET_VARS['valami']
Ha végig lépkedek a tömbön és módosítom az értékeit, akkor változik a $valami értéke is?
A számok esetében elég egy intval($valami), mert az is_int($valami)-nál stringként (gettype-vel ell.) szerepel (még ha számsor is)?
4

ennél azért kicsitt összetettebb a téma

Hodicska Gergely · 2006. Júl. 7. (P), 16.48
Érdemes kicsit olvasgatni, mert elég sok érdekes dolgot lehet találni. Pl. két apróság, amit már említettem itt is korábban. Pl. pg_escape_string() függvény nem figyel a ; jelre, vagy egy keresésnél nyugodtan megadhat valaki % jelet a szövegben, amivel jelentős errőforrást vehet el a szervertől, és a sima escape függvények nem fogják kiszűrni Neked.


Felhő

u.i. Van egy ilyen cucc is: SafeSQL