| Termin | Definicja |
|---|---|
| Waliduj wszystkie dane wejściowe (formularze | Walidacja wszystkich danych wejściowych, w tym formularzy, chroni przed atakami typu injection. Waliduj wszystkie dane wejściowe (formularze – czym jest walidacjaHasło „Waliduj wszystkie dane wejściowe (formularze” oznacza zasadę, zgodnie z którą każda wartość przekazywana do aplikacji powinna zostać sprawdzona przed użyciem, zapisaniem lub przekazaniem do kolejnego elementu programu. Dotyczy to nie tylko pól widocznych w formularzu kontaktowym, lecz także parametrów adresu strony, nagłówków żądania, plików przesyłanych przez użytkownika, danych zapisanych w ciasteczkach, wartości pochodzących z aplikacji mobilnej oraz informacji otrzymywanych z innych usług. Nie należy zakładać, że dane są bezpieczne tylko dlatego, że formularz ma ograniczenia ustawione w przeglądarce. Walidacja jest kontrolą zgodności danych z oczekiwanym formatem i znaczeniem. Jeżeli pole powinno zawierać adres poczty elektronicznej, należy sprawdzić jego strukturę. Jeżeli użytkownik ma podać liczbę, trzeba zweryfikować, czy rzeczywiście jest liczbą, czy mieści się w dopuszczalnym zakresie i czy nie została zapisana w sposób mogący zmienić działanie programu. Jeżeli formularz przyjmuje nazwę, komentarz albo opis zgłoszenia, należy ustalić dozwoloną długość, kodowanie oraz sposób bezpiecznego wyświetlania tekstu. Sama obecność pola i komunikatu w interfejsie nie stanowi ochrony. Najważniejsza reguła brzmi: dane pochodzące od użytkownika należy traktować jako niezaufane aż do chwili przejścia odpowiednich kontroli. Dotyczy to również danych przesłanych przez osobę zalogowaną. Prawidłowe konto może wysłać nieoczekiwaną wartość celowo albo wskutek błędu aplikacji, dlatego uprawnienia użytkownika nie zastępują walidacji. Sprawdzenia powinny być wykonywane po stronie serwera lub innego elementu, który podejmuje decyzję, ponieważ kontrolę w przeglądarce można pominąć, zmienić albo całkowicie ominąć. Waliduj wszystkie dane wejściowe – kontekst techniczny i porównaniaW praktyce warto rozróżnić walidację składniową, typową, zakresową, semantyczną i biznesową. Walidacja składniowa odpowiada na pytanie, czy tekst ma właściwy kształt, na przykład czy identyfikator składa się wyłącznie z przewidzianych znaków. Walidacja typowa sprawdza, czy wartość jest tekstem, liczbą, datą, wartością logiczną albo listą. Walidacja zakresowa bada wartości minimalne i maksymalne, a także długość tekstu. Walidacja semantyczna sprawdza sens informacji, na przykład czy data zakończenia nie przypada przed datą rozpoczęcia. Walidacja biznesowa uwzględnia reguły działania aplikacji, takie jak możliwość wykonania danej czynności tylko w określonym stanie zgłoszenia. Przydatne jest odróżnienie listy dozwolonych wartości od listy wartości zakazanych. Podejście oparte na dozwolonym zbiorze, nazywane często allowlistą, określa dokładnie, co może zostać przyjęte. Przykładem może być pole wyboru województwa przyjmujące wyłącznie wartości z ustalonej listy. Podejście oparte wyłącznie na odrzucaniu znanych niebezpiecznych znaków jest słabsze, ponieważ może nie uwzględnić innego zapisu, kodowania albo nowego wariantu danych. Nie oznacza to, że odrzucanie oczywiście błędnych wartości jest zbędne, lecz nie powinno być jedyną warstwą ochrony. Walidację należy odróżnić od oczyszczania danych oraz od kodowania kontekstowego. Walidacja decyduje, czy wartość spełnia reguły. Oczyszczanie może usuwać lub zmieniać niektóre elementy, ale nie powinno maskować błędnych danych bez śladu. Kodowanie kontekstowe zabezpiecza sposób prezentowania wartości, na przykład w treści HTML, atrybucie, zapytaniu lub komunikacie. Ta sama wartość może wymagać innego postępowania zależnie od miejsca użycia. Bezpieczne przechowywanie danych nie gwarantuje bezpiecznego wyświetlenia, a poprawna kontrola formularza nie zastępuje parametrów zapytania do bazy danych. Dobrym rozwiązaniem jest stosowanie kilku niezależnych warstw: kontrola typu i zakresu, bezpieczne przygotowanie operacji na danych, kodowanie przy prezentacji, ograniczenie uprawnień oraz rejestrowanie odrzuconych prób. Dzięki temu pojedynczy błąd w jednym miejscu nie musi prowadzić do pełnego obejścia zabezpieczeń. Należy również uważać na różnice między walidacją a normalizacją, ponieważ automatyczna zamiana znaków, usuwanie spacji albo konwersja wielkości liter może zmienić znaczenie danych. Waliduj wszystkie dane wejściowe – typowe problemy i błędyCzęstym problemem jest sprawdzanie wyłącznie formularza w przeglądarce. Taka kontrola poprawia wygodę korzystania z aplikacji, ponieważ użytkownik szybciej otrzymuje informację o brakującym polu lub błędnym formacie, ale nie powinna być traktowana jako granica bezpieczeństwa. Żądanie można wysłać poza interfejsem, a wartość odrzucaną przez skrypt przeglądarki można zastąpić inną. Kontrola po stronie serwera powinna powtórzyć wszystkie istotne warunki i zwrócić jednoznaczny komunikat bez ujawniania szczegółów wewnętrznego działania aplikacji. Innym błędem jest używanie niewłaściwego typu danych. Identyfikator przechowywany jako zwykły tekst może zostać potraktowany jak fragment polecenia, jeżeli program składa operację z połączonych ciągów. Bezpieczniejsze jest użycie parametrów, typów ścisłych i bibliotek, które rozdzielają dane od instrukcji. Przy zapytaniach do bazy danych nie powinno się budować treści polecenia przez sklejanie tekstu z wartością przekazaną w formularzu. Podobnie przy wywoływaniu poleceń systemowych, tworzeniu ścieżek plików i generowaniu treści strony należy korzystać z mechanizmów przewidzianych do bezpiecznego przekazywania danych. Ryzyko może powstać także przez brak ograniczeń rozmiaru. Bardzo długi tekst, duży plik, ogromna liczba elementów listy lub wielokrotnie zagnieżdżone dane mogą przeciążyć aplikację. Dlatego należy określić maksymalną długość pola, rozmiar pliku, liczbę załączników, głębokość zagnieżdżenia i czas przetwarzania. Kontrola rozszerzenia pliku nie wystarcza; trzeba sprawdzać rzeczywisty typ, sposób odczytu oraz miejsce przechowywania. Pliki użytkownika nie powinny być automatycznie traktowane jako wykonywalne ani umieszczane w miejscu, w którym mogą zostać uruchomione jako część aplikacji. Do typowych usterek należy również niespójne kodowanie znaków. Znaki specjalne, różne reprezentacje spacji, znaki niewidoczne i odmienne sposoby zapisu liter mogą sprawić, że kontrola oceni jedną postać danych, a kolejny etap zinterpretuje inną. Pomaga ustalenie jednolitego kodowania, świadoma normalizacja oraz testy obejmujące znaki narodowe, znaki sterujące i nietypowe, ale legalne przypadki. Nie należy jednak usuwać znaków narodowych tylko dlatego, że są trudniejsze do obsługi. Błędne komunikaty również mają znaczenie. Użytkownik powinien otrzymać informację, które pole wymaga poprawy i jaki format jest oczekiwany, ale komunikat nie powinien ujawniać nazw tabel, ścieżek plików, fragmentów zapytań ani szczegółów konfiguracji. W logach warto zapisać zdarzenie w sposób przydatny do analizy, z ograniczeniem danych wrażliwych i bez przechowywania haseł, pełnych tokenów dostępu czy innych sekretów. Waliduj wszystkie dane wejściowe – praktyczne wskazówki wdrożenioweNajpierw należy sporządzić katalog wszystkich miejsc, w których aplikacja przyjmuje dane. Warto uwzględnić formularze, parametry w adresach stron, nagłówki, ciasteczka, przesyłane pliki, dane z importu, integracje oraz wartości pobierane z wcześniej zapisanych rekordów. Następnie dla każdego pola trzeba opisać oczekiwany typ, dozwolony format, zakres, długość, obowiązkowość, sposób normalizacji i miejsce późniejszego użycia. Taki opis ogranicza ryzyko, że jedno pole będzie traktowane inaczej przez formularz, warstwę przetwarzania i moduł raportowy. Reguły powinny być możliwie blisko logiki odpowiedzialnej za przyjęcie danych, lecz dobrze jest unikać ich wielokrotnego przepisywania. Wspólne schematy i biblioteki mogą ułatwić zachowanie jednolitych zasad, o ile są aktualizowane i poprawnie skonfigurowane. Każdą wartość należy sprawdzać w odpowiednim miejscu, a nie dopiero po zapisaniu. Przydatne jest rozdzielenie błędów użytkownika od awarii technicznej: brak wymaganej wartości powinien skutkować czytelnym odrzuceniem formularza, natomiast nieoczekiwany błąd programu powinien zostać zarejestrowany i obsłużony bez ujawniania wrażliwych informacji. Testy powinny obejmować wartości prawidłowe, puste, graniczne, zbyt długie, powtarzające się, o niewłaściwym typie, zawierające znaki specjalne oraz przesyłane z pominięciem interfejsu. Warto sprawdzać także różne kolejności pól, brak nagłówków, wielokrotne wysłanie tego samego formularza i próby zmiany identyfikatorów należących do innych kont. Testy automatyczne powinny być uruchamiane po zmianach w kodzie, a testy ręczne powinny potwierdzać zachowanie komunikatów i wygodę poprawiania błędów. Bezpieczeństwo nie powinno powodować utraty danych wpisanych przez użytkownika. Po odrzuceniu formularza warto zachować bezpieczne pola robocze, wskazać konkretne miejsce problemu i jasno opisać oczekiwany format. Hasła, kody jednorazowe i sekrety nie powinny być ponownie wyświetlane. Przy zmianie danych wrażliwych należy dodatkowo sprawdzać uprawnienia, aktualny stan rekordu i ochronę przed powtórzeniem żądania. Sama poprawność formatu nie oznacza, że osoba ma prawo wykonać daną operację. Warto też zaplanować obsługę zmian. Gdy wymagania biznesowe się zmieniają, reguły walidacji, komunikaty i testy powinny zostać zmienione razem. Szczególną uwagę należy poświęcić importom starszych danych, ponieważ informacje zapisane przed wprowadzeniem nowych ograniczeń mogą nie spełniać aktualnych warunków. Takie dane można oznaczyć do ponownej weryfikacji zamiast bezrefleksyjnie odrzucać albo uznawać za zaufane. Waliduj wszystkie dane wejściowe – kiedy zgłosić się do serwisuWarto skonsultować stan urządzenia lub oprogramowania z serwisem, gdy formularze zaczynają działać niestabilnie, przeglądarka wyświetla nieoczekiwane komunikaty, system samoczynnie otwiera nieznane strony, pojawiają się nowe rozszerzenia albo programy, a także wtedy, gdy dane wpisywane w formularzach znikają lub zostają zmienione. Nie należy ignorować powtarzających się ostrzeżeń o certyfikatach, blokad zabezpieczeń, nieznanych oknach logowania i próbach pobrania plików. Objaw może wynikać z konfiguracji przeglądarki, uszkodzenia systemu, niepożądanego programu albo błędu w używanej aplikacji, dlatego potrzebne jest rozdzielenie problemu sprzętowego od programowego. Przed przekazaniem urządzenia dobrze jest zanotować, kiedy pojawił się problem, jakie działanie go poprzedziło i czy występuje w każdej przeglądarce lub tylko w jednej. Nie należy podawać osobom postronnym haseł, kodów autoryzacyjnych ani kluczy odzyskiwania. Jeżeli doszło do podejrzanego logowania, należy skorzystać z bezpiecznego urządzenia, zmienić hasło, zakończyć aktywne sesje i włączyć dodatkowe zabezpieczenie konta. W przypadku ważnych plików należy najpierw zadbać o kopię zapasową, o ile stan urządzenia na to pozwala. Warszawskie Pogotowie Komputerowe 24/7 może pomóc w ocenie problemów z laptopem związanych z działaniem systemu, przeglądarki, formularzy i ochrony danych. W praktyce warto przekazać opis objawów oraz informację, czy problem dotyczy jednego programu, wielu stron czy całego urządzenia. Takie dane ułatwiają ustalenie kolejności sprawdzeń i ograniczają ryzyko przypadkowego usunięcia potrzebnych informacji. Najważniejsze jest przyjęcie zasady, że każdy punkt wejścia wymaga własnej kontroli, nawet jeśli dane pochodzą z pozornie zaufanego źródła. Formularz, import pliku, parametr adresu i odpowiedź innego programu mogą zostać zmienione, dlatego bezpieczne przetwarzanie powinno łączyć walidację, właściwe typy, parametryzację operacji, kodowanie wyników, ograniczenia rozmiaru, kontrolę uprawnień, rejestrowanie zdarzeń i regularne testowanie. Dopiero taki zestaw daje podstawę do ograniczenia ryzyka injection oraz innych skutków nieprawidłowych danych wejściowych. |