2012. november 25., vasárnap

Unique kulcsok a címsorban?

Történt egyszer nemrég, hogy megkértek, vessek már egy gyógypillantást egy honlapra, hogy mégis mennyire néz ki biztonságosnak... Erről szeretnék egy szösszenetet megosztani.

Tegyük fel, hogy a cég origami művek előállításáról készített leírásokat, és ezeket árulja a honlapján. (Jobb hazugság most nem jutott eszembe) Tehát egy zip file-ban van egy db origamis leírás, amit mondjuk egy emelt díjas sms-sel tudsz letölteni. Az olcsóbb árért a papírcsákót töltheted le, a drágább árért meg a gőzhajót :)

Az eladó rendkívül korrekt, mert a honlapnak van egy  demo aloldal része, ahonnan ingyen le tudsz tölteni néhány origamis cuccot. Tehát láthatja a kedves vevő, hogy pl.: mennyire érthető számára a leírás, mielőtt bármennyit is fizetne valami durvább figuráért...

Na és ez hogy nézett ki :

Amikor rávittem az egeret a letöltés linkre, akkor a következőt olvastam a böngésző bal alsó sarkában:

http://www.azénorigamiscégem.hu/download.php?id=152

Letöltöttem, kicsomagoltam, megpróbáltam összehajtogatni az A4-est ahogy a leírásban volt (illetve próbáltam volna, ha igaz lenne a példám) és sikerült is, öröm van.

Aztán jött egy gyanús gondolat... Vajon milyen terméket rejthet  a 151-es sorszámú oldal?

Az eredetileg post metódusokkal dolgozó oldalt gyorsan átjavítottam :) download.php?id=151 -re és láss csodát, bejött a másik demó anyag. Letöltésre kívánja fel nekem a böngésző, ugyanúgy, mint az előbb is. Hmm...

Mennyi is az idő? Pont itt az ideje, hogy végiggépeljem gyorsan azt a pár ID értéket, és pikk-pakk meg is kaptam az összes fizetős zip fájlomat, ami csak létezik a cég repertoárjában!

Minek kínlódni a felhasználónév/jelszó párosokkal, meg mindenféle Sql Injectiont csinálni, ha noname módon, bejelentkezés/regisztrálás nélkül minden "termékhez" hozzáférek ? :)


Hát nem volt őszinte a mosoly, amikor ez kiderült,mivel fel volt készítve az oldal az Sqli ellen. Tehát volt benne munka bőven.

Csupán egy valamit hagytak figyelmen kívül: Az egyedi kulcsot, amivel azonosítják a terméküket a terméktáblában, simán kirakták a böngésző címsorába, hogy hadd lássa mindenki. Ezzel meg az a gond, hogy a webszerver és az sql szerver közötti "technikai user" aki szállítja az adatokat a honlapra, az :

1.: Nem fog gondolkodni hogy ezt vajon szabad-e (nem is az ő feladata)
2.: Mindenhez hozzáfér az adatbázisban. (Miért? Mert pl az admin módosítani szeretne valamit az adminisztrációs oldalon a termékről, akkor muszáj az oldalnak azt megjelenítenie.)


Mi az egyik legegyszerűbb/leghatékonyabb megoldás erre?

Használjunk egy olyan mezőt a táblánkban, amit kimondottan erre a célra fogunk felhasználni, és nem lehet kitalálni! Ajánlom mindenki figyelmébe a uniqueidentifier adattípust.

A táblára pedig mehet a :

ALTER TABLE termekek
ADD URLCode uniqueidentifier DEFAULT newid()

Ezzel lesz egy URLCode nevű mezőnk ami a newid() függvénnyel kap egy ehhez hasonló értéket:
6F3219FF-8B87-D601-B31D-00C04ABC64FF

És akkor ezt szépen ki lehet rakni a nagyérdemű elé:

http://www.azénorigamiscégem.hu/download.php?id=6F3219FF-8B87-D601-B31D-00C04ABC64FF

A newid() előnye hogy (elvileg) nem ad vissza két ugyanolyan értéket, akárhányszor futtatod...
Na most jöhet a csúnya user, és mit csinál, hozzáad egyet ? :)


De hogy korrekt legyek, a cost részét is megemlítem. Mert míg az int típusú (identity által kiosztott) kulcsunk 4 byte-ot kér enni minden rekordnál, addig az URLCode-unk 16 byte-ot.

Na bumm... Szegény Buffer Cache-ünk hogy megtelik majd ! :)



Balázs

















4 megjegyzés:

  1. Én is annak vagyok híve, hogy ne aggassuk ki a db-t a netre, de nem szerencsés pluszban kezelni, hogy a user csak bizonyos url-t (jelen esetben fájlt) érjen el?

    VálaszTörlés
  2. De, és ebben az esetben ez úgy volt megoldva, hogy kaptál egy kódot smsben, és azzal tudtál authentikálni, és az általad kinézett gőzhajónak már láthattad is a linkjét. (értsd: Rá tudtál kattintani a letöltéshez)
    Hogyha guidot használtak volna, teljesen jó lett volna így.

    VálaszTörlés
  3. Javíts ki, ha tévedek, de a GUID is ugyanúgy érzékeny marad az SQL injection-re, a nehézség csak annyi, hogy a program, amit ír a hacker, az x-szer annyi idő alatt szedi le az összes file-t az id-hoz képest.

    VálaszTörlés
    Válaszok
    1. Szia!
      Így van! Attól mert nem egy kitalálható int típust, hanem egy "csúnya" GUID-ot használunk, az sqli még működhet...
      Azért egy Guid értéket kitalálni (ráadásul figyelembe véve azt,hogy nem kismillió féle papírcsákóm van, hanem csak pár száz db) nem biztos hogy olyan egyszerű, az ilyen célra írt programokkal kapcsolatban meg egyből a köv. jutott eszembe : Ips/Ids :)

      Törlés