Jako mezinárodní standardní dotaz do databáze byly SQL příkazy široce používány v různých programovacích prostředích. Jako vyspělý a stabilní systém jsou přihlašování uživatelů a ověřování hesla nezbytné. Při své každodenní programátorské práci jsem zjistil, že mnoho programátorů používá SQL příkazy k ověření uživatelských hesel pomocí takového příkazu:
sql="Vyberte * z uživatelské tabulky, kde jméno='"+jméno+"' a heslo='"+heslo+"'"
Jméno a heslo jsou uživatelská jména a hesla zadaná uživatelem a výše uvedené příkazy se provádějí k ověření, zda jsou uživatel a heslo legitimní a platné. Analýzou však lze zjistit, že v uvedených tvrzeních existují fatální mezery. Když zadáme následující řetězec do uživatelského jména: 111'or'1=1 a pak neformálně zadáme heslo, nastavíme ho na aaaa. Po nahrazení proměnné se SQL příkaz stává následujícím řetězcem:
sql="Vyberte * z uživatelské tabulky, kde jméno='111'or'1=1' a heslo='aaaa'
Všichni víme, že když příkaz select hodnotí podmínky dotazu, ignoruje následující operace a (and) při setkání s operacemi or (or), a hodnota 1=1 v uvedeném příkazu je vždy pravdivá, což znamená, že bez ohledu na to, jakou hodnotu je v hesle zadané, může ověření hesla projít výše! Řešení tohoto problému je velmi jednoduché a existuje mnoho metod, nejčastěji používanou je posouzení legitimity uživatele a hesla zadaného uživatelem před provedením ověření, přičemž speciální znaky, jako jsou jednoduché uvozovky a rovnice, nejsou povoleny.
Výše uvedené problémy, i když se mohou zdát jednoduché, skutečně existují. Například raná verze slavné online hry "Smiling Proud Jianghu" na internetu měla takový problém a autor také pečlivě analyzoval některé programy, které napsal dříve, po přečtení zprávy o zranitelnosti této hry, a bylo tam mnoho takových mezer. Tohle by opravdu mělo být naše pozornost. To také odhaluje nedostatek programátorských zkušeností a povědomí o bezpečnosti mladých programátorů, včetně autora. Zároveň nám to připomíná, že programátoři by měli při jeho navrhování plně zvážit bezpečnost programu a neměli by být nedbalí, protože i zdánlivě malá opomenutí může mít vážné důsledky.
|