Als internationaler Standard für Datenbankabfragen wurden SQL-Anweisungen in verschiedenen Programmierumgebungen weit verbreitet verwendet. Als reifes und stabiles System sind Benutzeranmeldung und Passwortverifizierung unerlässlich. In meiner täglichen Programmierarbeit habe ich festgestellt, dass viele Programmierer SQL-Anweisungen verwenden, um Benutzerpasswörter mit einer solchen Anweisung zu überprüfen:
sql="Wähle * aus der Benutzertabelle, wobei name='"+name+"' und password='"+password+"'"
Name und Passwort sind die vom Benutzer eingegebenen Benutzernamen und Passwörter, und die obigen Anweisungen werden ausgeführt, um zu überprüfen, ob Benutzer und Passwort legitim und gültig sind. Durch die Analyse zeigt sich jedoch, dass es fatale Schlupflöcher in den obigen Aussagen gibt. Wenn wir die folgende Zeichenkette im Benutzernamen eingeben: 111'or'1=1 und dann das Passwort beiläufig eingeben, setzen wir es auf aaaa. Nachdem die Variable ersetzt wurde, wird die SQL-Anweisung zu folgendem String:
sql="Select * aus der Benutzertabelle, wobei name='111'or'1=1' und password='aaaa'
Wir alle wissen, dass die select-Anweisung, wenn sie die Abfragebedingungen bewertet, die folgenden und(und)-Operationen ignoriert, wenn sie auf oder(oder)-Operationen trifft, und der Wert 1=1 in der obigen Aussage immer wahr ist, was bedeutet, dass egal welcher Wert im Passwort eingegeben wird, sie die oben genannte Passwortverifikation bestehen kann! Die Lösung dieses Problems ist sehr einfach, und es gibt viele Methoden; am häufigsten wird die Legitimität des Benutzers und des verwendeten Passworts vor der Überprüfung bewertet, und Sonderzeichen wie einfache Anführungszeichen und Gleichheitszeichen sind nicht erlaubt.
Die oben genannten Probleme, auch wenn sie einfach erscheinen mögen, existieren doch. Zum Beispiel hatte die frühe Version des berühmten Online-Spiels "Smiling Proud Jianghu" im Internet ein solches Problem, und der Autor analysierte auch sorgfältig einige der Programme, die er zuvor geschrieben hatte, nachdem er den Schwachstellenbericht zu diesem Spiel gelesen hatte, wobei es viele solcher Schlupflöcher gab. Das sollte wirklich unsere Aufmerksamkeit sein. Dies zeigt auch den Mangel an Programmiererfahrung und Sicherheitsbewusstsein junger Programmierer, einschließlich des Autors, auf. Gleichzeitig erinnert es uns daran, dass Programmierer bei der Gestaltung der Programmgestaltung die Sicherheit des Programms vollständig berücksichtigen und nicht nachlässig sein sollten, und ein scheinbar kleiner Auslass ernsthafte Folgen haben kann.
|