Strona główna » Algorytmy » Artykuły » Prosta Kontrola Dostępu
 

Prosta Kontrola Dostępu

Cel

Kontrolowanie dostępu do danych to w dzisiejszym świecie bardzo duże wyzwanie. W tym artykule zostanie przedstawiona idea jak wygląda mechanizm sprawdzania hasła oraz jak taką kontrolę dostępu można rozwinąć.

Uwaga!

Poniższe implementacje mają jedynie za zadanie zapoznać ze schematem kontroli dostępu. Należy pamiętać, że wstawianie na stałe hasła wewnątrz programu pozwala bardzo łatwo odczytać takie hasło. Z reguły należałoby sprawdzić poprawność hasła poprzez weryfikację na zewnętrznym serwerze.

Implementacja

Wczytaj i Sprawdź

Kontrola dostępu ma za zadanie zweryfikować czy użytkownik ma dostęp do ukrytych danych. Podczas logowania w systemie lub na stronach internetowych należy podać login oraz hasło. Na potrzeby przedstawienia samego mechanizmu kontroli dostępu program ograniczy się do weryfikacji użytkownika. Oznacza to, że użytkownik uzyska dostęp do Sekretu tylko wtedy, gdy wpisze poprawne hasło. Najprostsza implementacja polega na wczytaniu hasła, sprawdzenia poprawności i wypisania odpowiedniego komunikatu. Oto przykładowy kod:

C++C#
Python
  1. haslo = input("Podaj hasło: ");
  2. if (haslo == "Test1234"):
  3.   print("Wpisano poprawne hasło!")
  4.   print("Odkryłeś sekret!")
  5. else:
  6.   print("Niepoprawne hasło!")

Tego typu rozwiązanie pozwala na wpisanie hasła tylko raz i w przypadku pomyłki program od razu się zamyka. Dla użytkownika nie jest to wygodne rozwiązanie, ponieważ pomyłki się zdarzają, a próba ponownego uruchomienia aplikacji może potrwać.

Do Skutku

Użytkownik z pewnością będzie zadowolony, że jeśli wpisze złe hasło to będzie mógł się poprawić i spróbować jeszcze raz. Chcąc dać użytkownikowi nieskończenie wiele szans można zastosować nieskończoną pętle while. Program będzie wczytywał kolejne hasła tak długo, aż zostanie wpisane poprawne hasło, albo użytkownik zamknie aplikację. Kontrola dostępu "do skutku" może mieć następując kod:

C++C#
Python
  1. haslo = ""
  2. while (True):
  3.   haslo = input("Podaj hasło: ")
  4.   if (haslo == "Test1234"):
  5.     break
  6.   else:
  7.     print("Niepoprawne hasło!")
  8. print("Wpisano poprawne hasło!");
  9. print("Odkryłeś sekret!");

Zatanówmy się jednak ile razy zdarza się wpisywać ponownie hasło? Zazwyczaj użytkownik wpisze poprawne hasło po maksymalnie trzech próbach. W przypadku, gdy użytkownik próbuje wpisać hasło większą ilość razy to prawdopodobnie wcale go nie zna i po prostu próbuje wszystkich pomysłów (albo wręcz wszystkich możliwości!).

Ograniecznie Prób

Ograniczenie ilości możliwych prób wpisania ponownie hasła ma za zadanie wykryć osobę, która próbuje się włamać. Powszechnie stosowana praktyka powoduje, że po wyczerpaniu limitu prób konto zostaje zablokowane i w celu odblokowania należy dokonać dodatkowych czynności poza wpisaniem poprawnego hasła np. kliknęcie w link z maila, albo kontakt z biurem obsługi klienta. Modyfikacja poprzedniego kodu polega na dodaniu dodatkowej zmiennej licznik, która zliczy ile prób wpisania hasła nastąpiło.

C++C#
Python
  1. licznik = 0
  2. haslo = ""
  3. while (licznik < 5):
  4.   haslo = input("Podaj hasło: ")
  5.   if (haslo == "Test1234"):
  6.     break
  7.   else:
  8.     licznik += 1
  9.     print("Niepoprawne hasło!")
  10. if (licznik < 5):
  11.   Console.WriteLine("Wpisano poprawne hasło!")
  12.   Console.WriteLine("Odkryłeś sekret!")
  13. else:
  14.   Console.WriteLine("Konto zablokowane")
  15.   Console.WriteLine("Wyczerpano wszystkie próby")

Tym razem pętla może się zakończyć na dwa sposoby: użytkownik wpisze poprawne hasło, albo zostanie wyczerpany limit prób. Dopiero po opuszczeniu pętli na podstawie wartości licznika program stwierdza czy użytkownik ma dostęp do sekretu. Warto tutaj zaznaczyć, że sprawdzanie poprawności hasła oraz czy użytkownik ostatecznie uzyskał dostęp powinno być weryfikowane na zewnętrznym serwerze. Gwarantuje to, że hasło, które zostało zapisane w kodzie, nie byłoby tak łatwe do zdobycia, ponieważ hasło byłoby znane tylko w obrębie serwera weryfikującego.