Kaip tarptautinis standartinis duomenų bazės užklausos teiginys, SQL sakiniai buvo plačiai naudojami įvairiose programavimo aplinkose. Kaip brandžiai ir stabiliai sistemai, vartotojo prisijungimas ir slaptažodžio patvirtinimas yra būtini. Kasdieniame programavimo darbe pastebėjau, kad daugelis programuotojų naudoja SQL teiginius, kad patikrintų vartotojo slaptažodžius tokiu teiginiu:
sql="Pasirinkite * iš vartotojo lentelės, kur name='"+name+"' ir password='"+password+"'"
Vardas ir slaptažodis yra vartotojo įvesti vartotojo vardai ir slaptažodžiai, o aukščiau pateikti teiginiai vykdomi siekiant patikrinti, ar vartotojas ir slaptažodis yra teisėti ir galiojantys. Tačiau analizuojant galima nustatyti, kad aukščiau pateiktuose teiginiuose yra mirtinų spragų. Kai į vartotojo vardą įvedame šią eilutę: 111'arba'1=1, tada atsitiktinai įveskite slaptažodį, nustatome jį į aaaa. Pakeitus kintamąjį, SQL sakinys tampa tokia eilute:
sql="Pasirinkite * iš vartotojo lentelės, kur name='111'arba'1=1' ir password='aaaa'
Visi žinome, kad kai pasirinkimo sakinys vertina užklausos sąlygas, susidūręs su (arba) operacijomis jis ignoruos šias ir (ir) operacijas, o 1=1 reikšmė aukščiau pateiktame teiginyje visada yra teisinga, o tai reiškia, kad nesvarbu, kokia reikšmė įvesta į slaptažodį, jis gali praeiti aukščiau pateiktą slaptažodžio patikrinimą! Šios problemos sprendimas yra labai paprastas, ir yra daugybė metodų, dažniausiai naudojamas įvertinti vartotojo ir slaptažodžio teisėtumą prieš atliekant patikrinimą, o specialūs simboliai, tokie kaip viengubos kabutės ir lygybės ženklai, neleidžiami.
Minėtos problemos, nors ir gali atrodyti paprastos, egzistuoja. Pavyzdžiui, ankstyvoje garsiojo internetinio žaidimo "Smiling Proud Jianghu" versijoje internete buvo tokia problema, o autorius taip pat atidžiai išanalizavo kai kurias programas, kurias parašė anksčiau, perskaitęs šio žaidimo pažeidžiamumo ataskaitą, ir tokių spragų buvo daug. Tai tikrai turėtų būti mūsų dėmesys. Tai taip pat atskleidžia jaunų programuotojų, įskaitant autorių, programavimo patirties ir saugumo supratimo trūkumą. Tuo pačiu metu tai taip pat primena, kad programuotojai, kurdami programą, turėtų visiškai atsižvelgti į programos saugumą ir neturėtų būti aplaidūs, o iš pažiūros nedidelis praleidimas gali sukelti rimtų pasekmių.
|