Ca o instrucțiune standard internațională de interogare a bazei de date, instrucțiunile SQL au fost utilizate pe scară largă în diverse medii de programare. Fiind un sistem matur și stabil, verificarea autentificării utilizatorului și a parolei sunt esențiale. În munca mea zilnică de programare, am descoperit că mulți programatori folosesc instrucțiuni SQL pentru a verifica parolele utilizatorilor printr-o afirmație de genul aceasta:
sql="Select * din tabelul utilizatorului unde name='"+name+"' și password='"+password+"'"
Numele și parola sunt numele de utilizator și parolele introduse de utilizator, iar instrucțiunile de mai sus sunt executate pentru a verifica dacă utilizatorul și parola sunt legitime și valide. Totuși, prin analiză, se poate descoperi că există lacune fatale în afirmațiile de mai sus. Când introducem următorul șir în numele de utilizator: 111'or'1=1, apoi introducem parola casual, o setăm pe aaaa. După ce variabila este înlocuită, instrucțiunea SQL devine următorul șir:
sql="Select * din tabelul utilizatorului, unde nume='111'or'1=1' și parola='aaaa'
Știm cu toții că atunci când instrucțiunea select judecă condițiile de interogare, va ignora următoarele și (și) operații atunci când întâlnește sau (ou) operații, iar valoarea 1=1 din instrucțiunea de mai sus este întotdeauna adevărată, ceea ce înseamnă că, indiferent de valoarea introdusă în parolă, aceasta poate trece verificarea parolei de mai sus! Soluția la această problemă este foarte simplă și există multe metode, cea mai frecvent folosită fiind evaluarea legitimității utilizatorului și a parolei introduse de utilizator înainte de a efectua verificarea, iar caractere speciale precum ghilimele simple și semnele egale nu sunt permise.
Problemele de mai sus, deși pot părea simple, există. De exemplu, versiunea timpurie a faimosului joc online "Smiling Proud Jianghu" de pe Internet a avut o astfel de problemă, iar autorul a analizat cu atenție unele dintre programele pe care le scrisese anterior după ce a citit raportul de vulnerabilități despre acest joc, existând multe astfel de portițe. Chiar ar trebui să ne concentrăm atenția. Acest lucru scoate la iveală și lipsa de experiență în programare și de conștientizare privind securitatea tinerilor programatori, inclusiv a autorului. În același timp, ne amintește și că programatorii ar trebui să țină cont de securitatea programului atunci când îl proiectează și să nu fie neglijent, iar o omisiune aparent mică poate avea consecințe serioase.
|