Parametry użytkownika
Kodowanie,  Poradnik

Parametry użytkownika

System informatyczny rzadko działa w oderwaniu od człowieka. Nawet najprostsza aplikacja musi wiedzieć, kto korzysta z usługi, jakie ma uprawnienia, jakie preferencje zapisu danych, w jakim języku pracuje i jakie operacje są dla niego dozwolone. Bez tego nie da się poprawnie zbudować logowania, personalizacji ani bezpieczeństwa. W praktyce cała ta warstwa sprowadza się do dobrze zaprojektowanych danych opisujących Parametry użytkownika.

PoleTyp danychPrzykładZnaczenie
idBIGINT / UUID10452trwały identyfikator
emailVARCHARuser@firma.plkontakt i logowanie
password_hashVARCHARhash bcryptbezpieczeństwo
statusENUMactivestan konta
created_atTIMESTAMP2026-04-20data utworzenia

Tabela roles nie powinna przechowywać logiki biznesowej w kodzie na sztywno. Lepiej przypisać rolę w bazie.

idnazwa roli
1admin
2manager
3operator

Relacja wiele-do-wielu między użytkownikiem a uprawnieniami jest standardem w większych systemach.

Przykładowy wzór oceny poziomu ryzyka konta może wyglądać tak:

ZastosowanieWzór
ocena ryzyka logowaniaR = aL + bF + cI

Gdzie:

  • L — liczba nieudanych logowań
  • F — częstotliwość zmian urządzeń
  • I — nietypowość adresu IP
  • a, b, c — wagi ustalone przez system

Taki model stosuje się np. przy wymuszaniu dodatkowego uwierzytelnienia.

Parametry użytkownika a walidacja danych wejściowych, spójność rekordów i unikanie kosztownych błędów

Najwięcej problemów nie wynika z braku danych, ale z ich złej jakości.

Typowe błędy:

  • brak walidacji adresu e-mail
  • możliwość ustawienia pustego hasła
  • zapis ujemnego limitu transakcji
  • niespójna strefa czasowa
  • przechowywanie dat jako tekst

Walidacja musi występować na dwóch poziomach:

  1. po stronie aplikacji
  2. po stronie bazy danych

Sama walidacja frontendowa nie wystarcza. Użytkownik może ominąć formularz i wysłać żądanie bezpośrednio do API.

Przykład walidacji w Python

JęzykKod
Pythonpython\nemail = input()\n\nif \"@\" not in email or len(email) < 5:\n print(\"Błędny adres\")\nelse:\n print(\"OK\")\n

Przykład walidacji w C

JęzykKod
Cc\n#include <stdio.h>\n#include <string.h>\n\nint main() {\n char email[100];\n scanf(\"%99s\", email);\n\n if (strchr(email, '@') == NULL) {\n printf(\"Bledny adres\\n\");\n } else {\n printf(\"OK\\n\");\n }\n return 0;\n}\n

Przykład walidacji w C++

JęzykKod
C++cpp\n#include <iostream>\n#include <string>\n\nint main() {\n std::string email;\n std::cin >> email;\n\n if (email.find('@') == std::string::npos) {\n std::cout << \"Bledny adres\\n\";\n } else {\n std::cout << \"OK\\n\";\n }\n}\n

W systemach produkcyjnych walidacja jest znacznie bardziej rozbudowana: regex, reguły biznesowe, ograniczenia transakcyjne i kontrola integralności relacyjnej.

Zarządzanie uprawnieniami i kontrola dostępu bez niebezpiecznych uproszczeń

Bardzo częsty błąd to logika typu:

if user == admin

To działa tylko chwilowo. Gdy pojawia się więcej ról, system zaczyna się rozpadać.

Lepszy model to RBAC – Role-Based Access Control.

Schemat działania:

  1. użytkownik ma przypisaną rolę
  2. rola ma przypisane uprawnienia
  3. aplikacja sprawdza uprawnienie, nie nazwę roli

Przykład:

OperacjaWymagane uprawnienie
usunięcie fakturyinvoice.delete
podgląd raportureport.read
eksport danychexport.execute

Dzięki temu można dodać nową rolę bez zmian w kodzie aplikacji.

W systemach finansowych lub medycznych stosuje się dodatkowo zasadę najmniejszych uprawnień. Użytkownik dostaje tylko to, co jest absolutnie konieczne.

To ogranicza realne straty przy błędzie lub przejęciu konta.

Parametry użytkownika w kontekście bezpieczeństwa haseł, sesji i historii operacji

Hasło nigdy nie powinno być przechowywane w postaci jawnej.

Poprawny proces:

  1. użytkownik podaje hasło
  2. system generuje hash
  3. w bazie zapisywany jest tylko hash
  4. podczas logowania porównywany jest wynik funkcji skrótu

Najczęściej stosowane algoryt:

  • bcrypt
  • Argon2
  • scrypt

SHA-256 bez dodatkowych mechanizmów nie jest dziś wystarczającym zabezpieczeniem dla haseł użytkowników.

Przykład w Python:

JęzykKod
Pythonpython\nimport hashlib\n\nhaslo = \"Test123\"\nhash_hasla = hashlib.sha256(haslo.encode()).hexdigest()\nprint(hash_hasla)\n

To jest przykład edukacyjny, ale w praktyce należy używać bcrypt lub Argon2.

Warto też przechowywać:

  • datę ostatniej zmiany hasła
  • liczbę błędnych logowań
  • aktywne sesje
  • identyfikator urządzenia
  • historię krytycznych operacji

Brak tych danych często oznacza brak możliwości analizy incydentu po ataku.

Pułapki projektowe, które później kosztują najwięcej czasu i pieniędzy

Najdroższe błędy zwykle nie są spektakularne. To drobne decyzje z początku projektu.

Przykłady:

Jeden login jako klucz główny

Po zmianie adresu e-mail zaczyna się problem z relacjami i historią danych.

Brak wersjonowania zmian

Nie wiadomo, kto zmienił limit kredytowy albo usunął dostęp operatorowi.

Nadmiar danych osobowych

System zbiera informacje, których nie potrzebuje. To zwiększa ryzyko prawne i koszt ochrony danych.

Brak polityki wygasania sesji

Użytkownik zostawia zalogowane stanowisko i ktoś przejmuje dostęp.

Uprawnienia zapisane na sztywno w kodzie

Każda zmiana wymaga wdrożenia produkcyjnego.

Takie decyzje wyglądają niewinnie na początku, ale po roku utrzymania stają się realnym kosztem operacyjnym.

FAQ

Czy identyfikator użytkownika powinien być adresem e-mail?

Nie. Adres e-mail może się zmienić. Identyfikator powinien być trwały i niezależny od danych biznesowych, najlepiej jako liczba lub UUID.

Czy walidacja w JavaScript wystarcza?

Nie. Frontend poprawia wygodę użytkownika, ale bezpieczeństwo musi być wymuszane także po stronie backendu i bazy danych.

Czy jedna rola dla jednego użytkownika to dobre rozwiązanie?

Tylko w bardzo prostych systemach. W praktyce lepiej przygotować model umożliwiający wiele ról lub bezpośrednie mapowanie uprawnień.

Dlaczego przechowywanie historii logowania jest ważne?

Pozwala wykrywać przejęcia kont, nietypowe logowania i analizować incydenty bezpieczeństwa po fakcie.

Czy wszystkie ustawienia powinny być w jednej tabeli?

Nie. Dane identyfikacyjne, bezpieczeństwo, konfiguracja i historia działań mają różne cele i powinny być logicznie rozdzielone.

Dobrze zaprojektowany model danych użytkownika nie jest dodatkiem do systemu, tylko jego fundamentem. Jeżeli ta warstwa jest zrobiona źle, problemy pojawiają się wszędzie: w bezpieczeństwie, raportowaniu, utrzymaniu i rozwoju aplikacji. Jeżeli jest zrobiona poprawnie, większość dalszych decyzji staje się po prostu prostsza.

Źródło Foto: Freepik

Dodaj komentarz