Karakter tiltás URL-ben
Szeretném minimásisra csökkenteni az SQL injection és más módszerekkel történő támadási kísérletek lehetőségét. A számos védekezés közül most konkrétan az URL-ről kérdeznék. A PHP elején, még mielőtt bármi történne, lefuttatok egy for ciklust, amiben leellenőrzöm a query stringet. Ha találok benne olyan karaktert, amivel SQL injection lehettséges, akkor kilépek a programból. A kérdés csak az, hogy milyen karaktereket érdemes keresni, azaz milyen karakterekkel lehettséges módosítani úgy egy linket, hogy azzal támadást lehessen intézni az oldal felé?
Összeszedtem már néhányat, csak kíváncsi lennék profik véleményére, mellesleg a feleslegeseket kigyomlálnám, ezzel is csökkentve a futási idejét (bár ez nyílván szinte nem is mérhető).
■ Összeszedtem már néhányat, csak kíváncsi lennék profik véleményére, mellesleg a feleslegeseket kigyomlálnám, ezzel is csökkentve a futási idejét (bár ez nyílván szinte nem is mérhető).
<Megint nincs cím>
Nem kell a spanyolviaszt feltalálni, vannak erre megfelelő mysql_escape_string, mysql_real_escape_string, addslashes függvények. Használd azt a post/get/cookie adatok megvizsgálására, de normálisan konfigurált szerver esetén (magic_quotes_gpc) már eleve kevés az esély ilyen támadásokra.
Én egyébként úgy csinálom, hogy már a környezeti oszályom legelején array_map-pel bejárom a post/get/cookie szuperglobális tömböket (mysql_escape_string) így később a programban erre már nem kell figyelni, mindenhova biztonságosan jutnak el az adatok.
<Nincs cím>
Meglehetősen komplex rendszerről van szó, és az említett függvények használatát sajnos elhanyagoltam az elején... Utólag nem kis meló lenne, ezért trükközök a query string csekkolással - tehát nem spanyol viasz feltalálásról van szó.
Esetleg egy példát tudnál mutatni, hogy hogyan is kellene felépíteni ezt az osztályt, ami lecsekkolja a szuperglobáliasaimat?
Array_map
<Nincs cím>
Mialatt utánaolvastam a dolgoknak, tallátam egy ilyet:
mysql_real_escape_string
et, érdemes lecsekkolni, hogy amagic_quotes
ki vagy be van-e kapcsolva...?*ab*_real_escape_string()
', ", \, NUL
karaktereket kódolja, utóbbi a
NUL (ASCII 0), \n, \r, \, ', ", és Control-Z
karaktereket. Stringek adatbázisba vitelénél - vegyük a MySQL esetét - a mysql(i)_real_escape_string használata ajánlott.
Ha SQL Injection ellen védekezel, érdemes figyelni a karakterkódolásokra is egyes UTF-8-as esetekben. Nem véletlen a "bizonytalan" mondat: nemrég volt blogmarkban egy cikk, amiben írtak erről, de nem találom...
Az XSS támadások, cross-site scripting ellen tudtommal többé-kevésbé véd az addslashes, ráadásként én még a (, ), <, >, valamit ; karaktereket szanálnám a query stringből. (Az általam ismert egyik legjobb XSS témájú oldal ez.)
Remélem, kiegészít még valaki, ha kell; engem is érdekel a téma.
Szerk.: Igen, a magic_quotes_qpc-t mindenképp figyelni kell, hogy a már "megtisztított" stringet ne nyomd tele újra escape karakterekkel.
D.
http://e-arc.hu/
Korrekt
Hibás megközelítés SZVSZ
Normálisan konfigurált szerver messziről elkerüli a magic_quotes használatát. Igazából semmire sem jó, a PHP egyik nagyon elhibázott húzása, nem véletlenül van mysql_real_escape_string.
És mi van akkor, ha nem adatbázisba szeretnéd beszúrni a cuccot? Például levélküldés elég gyakori. Én azt a megközelítést szeretem, hogy az elején ellenőrzöm, hogy van-e magic_quotes, ha igen eliminálom, az escapelés pedig az adatbázis réteg feladata, hisz csak annak használata esetén van értelme, ráadásul így DB-függő lesz az escapelés, nem egy adott adatbáziskezelő esetében fog működni.
Felhő
u.i. Plusz ne felejtsük el, hogy a mysql_real_escape_string, illetve magaz az escapelés sem old meg minden problémát.
Pont ezen gondolkoztam anno
Arra viszont kíváncsi lennék, mit hagy figyelmen kívül a - pl. - mysql_real_escape_string. Mire kell még figyelni?
D.
http://e-arc.hu/
multi query, LIKE
A másik eset pl.: ha LIKE-ot használunk, akkor az escapelés a % és _ karaktereket nem escapeli, ezért mi hiába az input%-ra keresünk, a felhasználó nyugodtan be`rhatja a keresés elejére a %-ot. Ezáltal a DB már nem fog tudni indexet használni, így ez alkalmas lehet DoS támadásra. Ez ellen jó lehet a addcslashes használata.
Felhő
Köszönöm!
Ellenőrzés nálam is van...
Spec karakterek emailben?
Mi köze van az SQL vezérlő karaktereknek az emailhez?
Ráadásul rossz adatot fogsz küldeni ha levélben használod az így kezelt inputot: "isn't" => "isn\'t".
Felhő
<Nincs cím>
Csak erre reflektáltam (ha nem lenne érthető):
Egyébként pedig mindenki úgy használja ahogy jólesik, én például így. Akinek ez nem tetszik, vagy tud jobbat, az meg máshogy, ennyi.
fejlődés
Meg lehet menetközben finomítani a használt technikákon. ;)
Én sem ezzel a megoldással kezdtem. De persze nem kötelező.
Felhő
Rossz a megközelítés!
Fontos az is, hogy értelmes hibaüzeneteket írj ki, mert nem biztos, hogy mindenki a te szerveredet fogja támadni, lehet, hogy valami más hiba miatt próbálnak meg rossz adatokat küldeni neked.
pl.:
http://weblabor.hu/blog/20030826/wfszbiztonsagi
pp
<Nincs cím>
A cikknek viszont nekiugrok, érdekesnek ígérkezik. Köszönöm.
Kereső -> GET
<Nincs cím>
magic_quotes_gpc
on és off állásán is hozzáteszi a visszaper jeleket. Egészen addig, amíg nem csak kiiratom, hanem el is küldöm az adatbázisba. Csak arra tudok gondolni, hogy maga a MySQL veszi le róla a visszapert, vagy nem tudom, nem értem... Ennek így kell működnie, vagy mit néztem el?Szerver:
- WinXP Pro
- WAMP v1.6.1
-- Apache v2.0.55
-- PHP v5.1.2
-- MySQL v5.0.18
Senki?