Ako medzinárodný štandardný dotaz na databázu sa SQL príkazy široko používajú v rôznych programovacích prostrediach. Ako vyspelý a stabilný systém je nevyhnutné overiť prihlásenie používateľa a heslo. Vo svojej každodennej programátorskej práci som zistil, že mnohí programátori používajú SQL príkazy na overenie používateľských hesiel prostredníctvom takéhoto príkazu:
sql="Vyberte * z používateľskej tabuľky, kde meno='"+meno+"' a heslo='"+heslo+"'"
Meno a heslo sú používateľské mená a heslá zadané používateľom a vyššie uvedené príkazy sa vykonávajú na overenie, či sú používateľ a heslo legitímne a platné. Avšak analýzou možno zistiť, že v uvedených tvrdeniach existujú fatálne medzery. Keď zadáme nasledujúci reťazec do používateľského mena: 111'or'1=1 a potom neformálne zadáme heslo, nastavíme ho na aaaa. Po nahradení premennej sa SQL príkaz stáva nasledujúcim reťazcom:
sql="Vyberte * z používateľskej tabuľky, kde meno='111'or'1=1' a heslo='aaaa'
Všetci vieme, že keď príkaz select hodnotí podmienky dotazu, ignoruje nasledujúce operácie a (a) pri narazení na operácie or (alebo), a hodnota 1=1 v uvedenom príkaze je vždy pravdivá, čo znamená, že bez ohľadu na to, akú hodnotu je v hesle zadané, môže prejsť overením hesla! Riešenie tohto problému je veľmi jednoduché a existuje mnoho metód, najčastejšie používaná je posúdenie legitímnosti používateľa a hesla zadaného používateľom pred overením, pričom špeciálne znaky ako jednoduché úvodzovky a rovnaké nie sú povolené.
Vyššie uvedené problémy, hoci sa môžu zdať jednoduché, existujú. Napríklad skorá verzia slávnej online hry "Smiling Proud Jianghu" na internete mala takýto problém a autor tiež dôkladne analyzoval niektoré programy, ktoré predtým napísal, po prečítaní správy o zraniteľnosti tejto hry, a takýchto dier bolo mnoho. Toto by naozaj mala byť naša pozornosť. To tiež odhaľuje nedostatok programátorských skúseností a bezpečnostného povedomia mladých programátorov, vrátane autora. Zároveň nám to pripomína, že programátori by mali pri jeho navrhovaní dôkladne zvážiť bezpečnosť programu a nemali by byť nedbalí, pretože aj zdanlivo malé opomenutie môže mať vážne následky.
|