Jako międzynarodowe standardowe instrukcje zapytania bazy danych, instrukcje SQL były szeroko stosowane w różnych środowiskach programistycznych. Jako dojrzały i stabilny system, logowanie użytkownika i weryfikacja haseł są niezbędne. W mojej codziennej pracy programistycznej zauważyłem, że wielu programistów używa instrukcji SQL do weryfikacji haseł użytkowników za pomocą takiego stwierdzenia:
sql="Wybierz * z tabeli użytkownika, gdzie imię='"+imię+"' i hasło='"+password+"'"
Imię i hasło to nazwy użytkownika i hasła wprowadzone przez użytkownika, a powyższe instrukcje są wykonywane w celu weryfikacji, czy użytkownik i hasło są prawidłowe i ważne. Jednak analiza wykazała, że powyższe stwierdzenia zawierają śmiertelne luki. Gdy wpisujemy następujący ciąg w nazwie użytkownika: 111'or'1=1, a następnie wpisujemy hasło bez zachodu, ustawiamy je na aaaa. Po zastąpieniu zmiennej, instrukcja SQL staje się następującym ciągiem znaków:
sql="Wybierz * z tabeli użytkownika, gdzie imię='111'or'1=1' oraz hasło='aaaa'
Wszyscy wiemy, że gdy polecenie select ocenia warunki zapytania, ignoruje następujące operacje i (i) podczas napotykania operacji or (or), a wartość 1=1 w powyższym zatwierdzeniu jest zawsze prawdziwa, co oznacza, że niezależnie od wartości wpisanej w hasle, może przejść powyższą weryfikację hasła! Rozwiązanie tego problemu jest bardzo proste i istnieje wiele metod, najczęściej stosowana jest ocena wiarygodności użytkownika i hasła wpisanego przez użytkownika przed przeprowadzeniem weryfikacji, a specjalne znaki, takie jak cudzysłowy czy równe, są zabronione.
Powyższe problemy, choć mogą wydawać się proste, istnieją. Na przykład wczesna wersja słynnej gry online "Smiling Proud Jianghu" w Internecie miała taki problem, a autor dokładnie przeanalizował niektóre z wcześniejszych programów po przeczytaniu raportu o podatnościach tej gry, i było ich wiele. To naprawdę powinno przyciągnąć naszą uwagę. To również ujawnia brak doświadczenia programistycznego i świadomości bezpieczeństwa młodych programistów, w tym autora. Jednocześnie przypomina nam też, że programiści powinni w pełni brać pod uwagę bezpieczeństwo programu przy jego projektowaniu i nie powinni być niedbali, a pozornie drobne pominięcie może mieć poważne konsekwencje.
|