Nemzetközi szabványú adatbázis-lekérdezési állításként az SQL utasításokat széles körben alkalmazták különböző programozási környezetekben. Mint egy érett és stabil rendszer, elengedhetetlen a felhasználói bejelentkezés és jelszó-ellenőrzés. Napi programozási munkám során azt tapasztaltam, hogy sok programozó SQL utasításokat használ a felhasználói jelszavak ellenőrzésére egy ilyen állítással:
sql="Válassz * a felhasználói táblából, ahol a név='"+név+"' és jelszó='"+jelszó+"'"
A név és jelszó a felhasználó által megadott felhasználónevek és jelszavak, és a fenti kijelentéseket azért hajtják végre, hogy ellenőrizzék, a felhasználó és jelszó hiteles-e és érvényes. Elemzés során azonban megállapítható, hogy végzetes kiskapuk vannak a fent említett állításokban. Amikor a következő stringet írjuk be a felhasználónévbe: 111'or'1=1, majd lazán beírjuk a jelszót, beállítjuk aaaa-ra. A változó cseréje után az SQL utasítás a következő string lesz:
sql="Válassz * a felhasználói táblából, ahol a név='111'or'1=1' és jelszó='aaaa'
Mindannyian tudjuk, hogy amikor a select utasítás megítéli a lekérdezési feltételeket, figyelmen kívül hagyja a következő és (és) műveleteket, amikor vagy (vagy) műveleteket talál, és a fenti állításban az 1=1 érték mindig igaz, ami azt jelenti, hogy bármilyen értéket is írnak be a jelszóba, átlépheti a fenti jelszó-ellenőrzést! A probléma megoldása nagyon egyszerű, és számos módszer létezik; a leggyakrabban alkalmazott, hogy a felhasználó által megadott jelszó és a felhasználó által megadott jelszó hitelességét ítéljük meg az ellenőrzés előtt, és speciális karakterek, mint az idézőjelek és egyenlőségjelek nem engedélyezettek.
A fent említett problémák, bár egyszerűnek tűnhetnek, léteznek. Például az interneten elérhető híres online játék, a "Smiling Proud Jianghu" korai verziója ilyen problémával küzdött, és a szerző alaposan elemezte azokat a programokat, amelyeket korábban írt, miután elolvasta a sebezhetőségi jelentést erről a játékról, és sok ilyen kiskapu volt. Ez tényleg a mi figyelmünkre kellene odafigyelni. Ez feltárja a fiatal programozók, köztük a szerző esetében is, a programozási tapasztalat és a biztonsági ismeretek hiányát. Ugyanakkor emlékeztet arra is, hogy a programozóknak teljes mértékben figyelembe kell venniük a program biztonságát a program tervezésekor, és nem szabad hanyagnak lenniük, és egy látszólag apró hiányosság komoly következményekkel járhat.
|