Subskrybuj i czytaj
najbardziej interesujący
najpierw artykuły!

Pełny koniec to proste 4 litery. Ciekawe fakty na temat seksu, o których nikt Ci wcześniej nie mówił

Cześć. Nazywam się Sasza Barannik. W Mail.Ru Group kieruję działem rozwoju stron internetowych, składającym się z 15 pracowników. Nauczyliśmy się tworzyć strony internetowe dla dziesiątek milionów użytkowników i bez problemu radzimy sobie z kilkumilionową widownią dziennie. Sam zajmuję się tworzeniem stron internetowych od około 20 lat, a przez ostatnie 15 lat w mojej pracy programowałem głównie w PHP. Chociaż możliwości języka i podejście do programowania znacznie się zmieniły w tym czasie, zrozumienie głównych luk w zabezpieczeniach i umiejętność ochrony przed nimi pozostają kluczowymi umiejętnościami każdego programisty.

W Internecie można znaleźć wiele artykułów i poradników dotyczących bezpieczeństwa. Uważam, że ta książka jest dość szczegółowa, a jednocześnie zwięzła i zrozumiała. Mam nadzieję, że pomoże Ci to nauczyć się czegoś nowego i sprawi, że Twoje witryny będą bardziej niezawodne i bezpieczne.

P.S. Książka jest obszerna, dlatego tłumaczenie zostanie opublikowane w kilku artykułach. Więc zacznijmy...

Kolejna książka o bezpieczeństwie PHP? Istnieje wiele sposobów na rozpoczęcie książki o bezpieczeństwie PHP. Niestety nie czytałem żadnego z nich, więc będę musiał to przemyśleć w trakcie pisania. Może zacznę od najbardziej podstawowego i mam nadzieję, że wszystko się ułoży.

Jeśli weźmiemy pod uwagę abstrakcyjną aplikację internetową uruchomioną online przez firmę X, możemy założyć, że zawiera ona szereg komponentów, które w przypadku zhakowania mogą wyrządzić znaczne szkody. Który na przykład?

  • Szkody dla użytkowników: uzyskanie dostępu do poczty e-mail, haseł, danych osobowych, danych kart bankowych, tajemnic handlowych, list kontaktów, historii transakcji i głęboko strzeżonych tajemnic (takich jak ktoś, kto nazwie swojego psa Sparkle). Wyciek tych danych szkodzi użytkownikom (osobom indywidualnym i firmom). Aplikacje internetowe, które niewłaściwie wykorzystują takie dane, oraz hosty wykorzystujące zaufanie użytkowników również mogą wyrządzić szkody.
  • Szkoda dla samej firmy X: w wyniku szkody wyrządzonej użytkownikom reputacja ulega pogorszeniu, należy zapłacić odszkodowanie, utracić ważne informacje biznesowe, powstają dodatkowe koszty - na infrastrukturę, poprawę bezpieczeństwa, likwidację konsekwencji, koszty prawne, duże korzyści dla zwolnieni menedżerowie najwyższego szczebla itp.
  • Skoncentruję się na tych dwóch kategoriach, ponieważ to one obejmują większość problemów, którym powinna zapobiegać ochrona aplikacji internetowych. Wszystkie firmy, które doświadczyły poważnych naruszeń bezpieczeństwa, szybko piszą w notatkach prasowych i na swoich stronach internetowych, jak bardzo są na to wrażliwe. Radzę więc całym sercem odczuć wagę tego problemu, zanim zetkniecie się z nim w praktyce.

    Niestety, kwestie bezpieczeństwa bardzo często rozwiązuje się po fakcie. Uważa się, że najważniejsze jest stworzenie działającej aplikacji, która będzie odpowiadać potrzebom użytkowników, w akceptowalnym budżecie i ramach czasowych. To zrozumiały zestaw priorytetów, ale bezpieczeństwa nie można wiecznie ignorować. O wiele lepiej jest o tym stale pamiętać, wdrażając konkretne rozwiązania w trakcie rozwoju, gdy koszt zmian jest jeszcze niewielki.

    Wtórny charakter bezpieczeństwa jest w dużej mierze wynikiem kultury programowania. Niektórzy programiści oblewają się zimnym potem na myśl o luce w zabezpieczeniach, podczas gdy inni mogą kwestionować istnienie luki, dopóki nie udowodnią, że w ogóle nie jest to luka. Pomiędzy tymi dwiema skrajnościami jest wielu programistów, którzy po prostu wzruszą ramionami, ponieważ sprawy nie potoczyły się jeszcze dla nich źle. Trudno im zrozumieć ten dziwny świat.

    Ponieważ bezpieczeństwo aplikacji webowych musi chronić użytkowników ufających usługom aplikacji, konieczna jest znajomość odpowiedzi na następujące pytania:

  • Kto chce nas zaatakować?
  • Jak mogą nas zaatakować?
  • Jak możemy ich powstrzymać?
  • Kto chce nas zaatakować? Odpowiedź na pierwsze pytanie jest bardzo prosta: wszystko i wszystko. Tak, cały Wszechświat chce dać Ci nauczkę. Facet z podkręconym komputerem z systemem Kali Linux? Prawdopodobnie już Cię zaatakował. Podejrzany człowiek, który lubi wbijać ludziom szprychy w koła? Prawdopodobnie już wynajął kogoś, żeby cię zaatakował. Zaufany interfejs API REST, który dostarcza dane co godzinę? Prawdopodobnie został zhakowany miesiąc temu, aby dostarczyć Ci zainfekowane dane. Nawet ja mogę cię zaatakować! Nie musisz więc ślepo wierzyć tej książce. Uważaj, że kłamię. I znajdź programistę, który doprowadzi mnie do czystej wody i zdemaskuje moje szkodliwe rady. Z drugiej strony, być może on też zamierza cię zhakować...

    Celem tej paranoi jest ułatwienie mentalnej kategoryzacji wszystkiego, co wchodzi w interakcję z Twoją aplikacją internetową („Użytkownik”, „Haker”, „Baza danych”, „Niezaufane dane wejściowe”, „Menedżer”, „REST API”) i następnie przypisz każdej kategorii indeks zaufania. Oczywiście „hakerowi” nie można ufać, ale co z „bazą danych”? „Niezaufane dane wejściowe” mają swoją nazwę nie bez powodu, ale czy naprawdę odfiltrowałbyś post na blogu z zaufanego kanału Atom swojego kolegi?

    Ci, którzy poważnie podchodzą do hakowania aplikacji internetowych, uczą się korzystać z tego sposobu myślenia, często atakując zaufane źródła danych, a nie te podatne na ataki, w których istnieje mniejsze prawdopodobieństwo, że będą miały dobre zabezpieczenia. To nie jest przypadkowa decyzja: w prawdziwym życiu osoby z wyższym wskaźnikiem zaufania są mniej podejrzane. To właśnie na te źródła danych zwracam uwagę w pierwszej kolejności analizując aplikację.

    Wróćmy do „Baz danych”. Zakładając, że haker może uzyskać dostęp do bazy danych (a my, paranoicy, zawsze tak zakładamy), nigdy nie można mu ufać. Większość aplikacji ufa bazom danych bez żadnych pytań. Z zewnątrz aplikacja webowa wygląda jak jedna całość, jednak wewnątrz stanowi system pojedynczych komponentów wymieniających dane. Jeśli uznamy, że wszystkie te komponenty są zaufane, to w przypadku zhakowania jednego z nich wszystkie pozostałe szybko zostaną naruszone. Takich katastrofalnych problemów związanych z bezpieczeństwem nie da się rozwiązać stwierdzeniem: „Jeśli ktoś zhakuje bazę danych, to i tak stracimy”. Można tak powiedzieć, ale wcale nie jest faktem, że będziesz musiał to zrobić, jeśli początkowo nie zaufasz bazie i nie podejmiesz odpowiednich działań!

    Jak mogą nas zaatakować? Odpowiedź na drugie pytanie to dość obszerna lista. Możesz zostać zaatakowany z dowolnego miejsca, gdzie każdy komponent lub warstwa aplikacji internetowej otrzymuje dane. Zasadniczo aplikacje internetowe po prostu przetwarzają dane i przenoszą je z miejsca na miejsce. Żądania użytkowników, bazy danych, interfejsy API, kanały blogów, formularze, pliki cookie, repozytoria, zmienne środowiskowe PHP, pliki konfiguracyjne, pliki konfiguracyjne, a nawet wykonywane przez Ciebie pliki PHP - wszystkie mogą być potencjalnie zanieczyszczone danymi, co może naruszyć bezpieczeństwo i spowodować szkody. Zasadniczo, jeśli złośliwe dane nie są wyraźnie obecne w kodzie PHP użytym do wysłania żądania, prawdopodobnie dotrą jako „ładunek”. Zakłada się, że a) napisałeś kod źródłowy PHP, b) został on odpowiednio sprawdzony i c) nie otrzymałeś zapłaty od organizacji przestępczych.

    Jeśli korzystasz ze źródeł danych bez sprawdzenia, czy dane są całkowicie bezpieczne i nadają się do wykorzystania, jesteś potencjalnie narażony na atak. Musisz także sprawdzić, czy dane, które otrzymujesz, są zgodne z danymi, które wysyłasz. Jeśli dane wyjściowe nie zostaną całkowicie zabezpieczone, będziesz mieć poważne problemy. Wszystko to można wyrazić jako regułę dla PHP: „Sprawdź dane wejściowe; uciec z wyjścia.”

    To oczywiste źródła danych, które musimy w jakiś sposób kontrolować. Źródła mogą również obejmować pamięć po stronie klienta. Na przykład większość aplikacji rozpoznaje użytkowników poprzez przypisanie im unikalnych identyfikatorów sesji, które mogą być przechowywane w plikach cookie. Jeśli atakujący uzyska wartość z pliku cookie, może podszyć się pod innego użytkownika. Chociaż możemy ograniczyć niektóre ryzyko związane z przechwytywaniem lub manipulowaniem danymi użytkownika, nie możemy zagwarantować fizycznego bezpieczeństwa komputera użytkownika. Nie możemy nawet zagwarantować, że użytkownicy uznają „123456” za najgłupsze hasło po „hasle”. Dodatkową pikanterii dodaje fakt, że dziś pliki cookies nie są jedynym rodzajem przechowywania po stronie użytkownika.

    Innym często pomijanym ryzykiem jest integralność kodu źródłowego. W PHP coraz popularniejsze staje się tworzenie aplikacji w oparciu o dużą liczbę luźno powiązanych bibliotek, modułów i pakietów dla frameworków. Wiele z nich jest pobieranych z publicznych repozytoriów, takich jak Github, i instalowanych przy użyciu instalatorów pakietów, takich jak Composer i jego towarzysz internetowy Packagist.org. Dlatego bezpieczeństwo kodu źródłowego jest całkowicie zależne od bezpieczeństwa wszystkich usług i komponentów stron trzecich. Jeśli Github zostanie naruszony, najprawdopodobniej zostanie wykorzystany do dystrybucji kodu ze złośliwym dodatkiem. Jeśli Packagist.org - wówczas osoba atakująca będzie mogła przekierować żądania pakietów do własnych, złośliwych pakietów.

    Obecnie Composer i Packagist.org są podatne na znane luki w wykrywaniu zależności i dystrybucji pakietów, dlatego zawsze dokładnie sprawdzaj wszystko w swoim środowisku produkcyjnym i weryfikuj źródło wszystkich pakietów z Packagist.org.

    Jak możemy ich powstrzymać? Przełamanie zabezpieczeń aplikacji internetowej może być zadaniem od absurdalnie prostego do niezwykle czasochłonnego. Można założyć, że każda aplikacja internetowa ma gdzieś lukę w zabezpieczeniach. Powód jest prosty: wszystkie aplikacje są tworzone przez ludzi, a ludzie popełniają błędy. Zatem idealne bezpieczeństwo to marzenie. Wszystkie aplikacje mogą zawierać luki, a zadaniem programistów jest minimalizowanie zagrożeń.

    Będziesz musiał dokładnie przemyśleć, aby zmniejszyć prawdopodobieństwo szkód w wyniku ataku na aplikację internetową. W miarę rozwoju historii będę mówił o możliwych metodach ataku. Niektóre z nich są oczywiste, inne nie. Ale w każdym razie, aby rozwiązać problem, należy wziąć pod uwagę kilka podstawowych zasad bezpieczeństwa.

    Podstawowe zasady bezpieczeństwa Opracowując środki bezpieczeństwa, ich skuteczność można ocenić, biorąc pod uwagę następujące kwestie. Niektóre już cytowałem powyżej.
  • Nie ufaj nikomu i niczemu.
  • Zawsze zakładaj najgorszy scenariusz.
  • Zastosuj ochronę wielopoziomową (Defence-in-Depth).
  • Trzymaj się zasady „Keep It Simple Stupid” (KISS).
  • Przestrzegaj zasady „najmniejszych przywilejów”.
  • Atakujący wyczuwają niejasność.
  • Przeczytaj dokumentację (RTFM), ale nigdy jej nie ufaj.
  • Jeśli coś nie zostało przetestowane, to nie działa.
  • To zawsze twoja wina!
  • Omówmy krótko wszystkie punkty.1. Nie ufaj nikomu ani niczemu. Jak stwierdzono powyżej, prawidłową postawą jest założenie, że wszystko i wszyscy, z którymi wchodzi w interakcję aplikacja internetowa, chcą ją zhakować. Obejmuje to inne komponenty lub warstwy aplikacji potrzebne do przetwarzania żądań. Nic i wszystko. Bez wyjątków.2. Zawsze zakładaj najgorszy scenariusz Wiele systemów bezpieczeństwa ma jedną wspólną cechę: niezależnie od tego, jak dobrze są wykonane, każdy może zostać złamany. Jeśli weźmiesz to pod uwagę, szybko zrozumiesz zaletę drugiego punktu. Skoncentrowanie się na najgorszym scenariuszu pomoże Ci ocenić zakres i dotkliwość ataku. A jeśli tak się stanie, być może będziesz w stanie zmniejszyć nieprzyjemne konsekwencje dzięki dodatkowym środkom bezpieczeństwa i zmianom architektonicznym. Być może tradycyjne rozwiązanie, z którego korzystasz, zostało już zastąpione czymś lepszym?3. Stosuj wielopoziomową ochronę (Defense-in-Depth) Wielopoziomową ochronę zapożyczono z nauk wojskowych, ponieważ ludzie od dawna zdali sobie sprawę, że liczne ściany, worki z piaskiem, sprzęt, kamizelki kuloodporne i kolby zakrywające ważne narządy przed kulami i ostrzami wroga są właściwe podejście do bezpieczeństwa. Nigdy nie wiadomo, które z powyższych nie zapewni ochrony i należy zadbać o to, aby kilka warstw ochrony pozwoliło na skorzystanie z czegoś więcej niż tylko fortyfikacji polowych czy formacji bojowej. Oczywiście nie chodzi tylko o pojedyncze awarie. Wyobraź sobie napastnika wspinającego się po drabinie na gigantyczny średniowieczny mur i odkrywający, że za nim znajduje się kolejna ściana, z której spada na niego strzała. Hakerzy będą czuć to samo.4. Keep It Simple Stupid (KISS) Najlepsza obrona jest zawsze prosta. Można je łatwo opracować, wdrożyć, zrozumieć, używać i testować. Prostota redukuje błędy, zachęca do prawidłowego działania aplikacji i ułatwia wdrażanie nawet w najbardziej złożonych i nieprzyjaznych środowiskach.5. Przestrzegaj zasady „najmniejszych uprawnień”. Każdy uczestnik wymiany informacji (użytkownik, proces, program) powinien posiadać tylko takie prawa dostępu, jakie są mu potrzebne do wykonywania swoich funkcji.6. Atakujący wyczuwają ciemność Bezpieczeństwo by Obscurity opiera się na założeniu, że jeśli użyjesz Obrony A i nie powiesz nikomu, czym ona jest, jak działa i czy w ogóle istnieje, w magiczny sposób pomoże Ci to, ponieważ atakujący będą zdezorientowani. W rzeczywistości daje to tylko niewielką przewagę. Często doświadczony atakujący będzie w stanie zrozumieć, jakie środki podjąłeś, dlatego musisz zastosować jawną obronę. Ci, którzy mają zbytnią pewność, że niejasna ochrona przekreśla potrzebę prawdziwej ochrony, powinni zostać szczególnie ukarani, aby pozbyć się złudzeń.7. Przeczytaj dokumentację (RTFM), ale nigdy jej nie ufaj. Podręcznik PHP jest Biblią. Oczywiście nie została ona napisana przez Latającego Potwór Spaghetti, więc technicznie rzecz biorąc, może zawierać pewną ilość półprawd, przeoczeń, błędnych interpretacji lub błędów, które nie zostały jeszcze zauważone i poprawione. To samo dotyczy przepełnienia stosu.

    Wyspecjalizowane źródła wiedzy o bezpieczeństwie (skoncentrowane na PHP i nie tylko) zazwyczaj dostarczają bardziej szczegółowej wiedzy. Najbliższą Biblią na temat bezpieczeństwa PHP jest OWASP, która zawiera artykuły, przewodniki i wskazówki. Jeśli nie jest zalecane robienie czegoś na OWASP, nigdy tego nie rób!

    8. Jeśli nie zostało przetestowane, to nie działa. Wdrażając środki bezpieczeństwa, musisz napisać wszystkie testy działania niezbędne do weryfikacji. Łącznie z udawaniem, że jesteś hakerem, za którym płacze więzienie. Może się to wydawać naciągane, ale dobrą praktyką jest zapoznanie się z technikami hakowania aplikacji internetowych; dowiesz się o możliwych podatnościach, a Twoja paranoja wzrośnie. Jednocześnie nie trzeba mówić kierownictwu o nowo nabytej wdzięczności za zhakowanie aplikacji internetowej. Pamiętaj, aby używać zautomatyzowanych narzędzi do identyfikowania luk. Są przydatne, ale oczywiście nie zastępują wysokiej jakości recenzji kodu, a nawet ręcznego testowania aplikacji. Im więcej zasobów wydasz na testowanie, tym bardziej niezawodna będzie Twoja aplikacja.9. To zawsze twoja wina! Programiści są przyzwyczajeni do myślenia, że ​​luki w zabezpieczeniach zostaną wykryte w pojedynczych atakach, a ich konsekwencje będą znikome.

    Na przykład naruszenia bezpieczeństwa danych (dobrze udokumentowany i powszechny rodzaj włamań) są często postrzegane jako drobne problemy związane z bezpieczeństwem, ponieważ nie mają bezpośredniego wpływu na użytkowników. Jednak wyciek informacji o wersjach oprogramowania, językach programowania, lokalizacji kodu źródłowego, aplikacji i logice biznesowej, strukturze bazy danych i innych aspektach środowiska aplikacji internetowej oraz operacji wewnętrznych jest często krytyczny dla skutecznego ataku.

    Jednocześnie ataki na systemy bezpieczeństwa są często kombinacjami ataków. Indywidualnie są one nieistotne, ale czasami otwierają drogę innym atakom. Na przykład wstrzyknięcie SQL czasami wymaga określonej nazwy użytkownika, którą można uzyskać za pomocą ataku czasowego na interfejs administracyjny, zamiast znacznie droższej i widocznej brutalnej siły. Z kolei wstrzykiwanie SQL pozwala na realizację ataku XSS na konkretne konto administracyjne bez przyciągania uwagi dużą liczbą podejrzanych wpisów w logach.

    Niebezpieczeństwo rozpatrywania słabych punktów w oderwaniu polega na niedocenianiu ich zagrożenia, a co za tym idzie, na zbytniej nieostrożności w stosunku do nich. Programiści często są leniwi w naprawianiu luk, ponieważ uważają je za zbyt drobne. Powszechną praktyką jest również przerzucanie odpowiedzialności za bezpieczny rozwój na programistów końcowych lub użytkowników, często bez dokumentowania konkretnych problemów: nawet istnienie tych luk nie jest uznawane.

    Pozorna nieistotność nie jest istotna. Nieodpowiedzialnym jest zmuszanie programistów lub użytkowników do naprawienia luk w zabezpieczeniach, zwłaszcza jeśli nie zostałeś o nich nawet poinformowany.

    Walidacja danych wejściowych Walidacja danych wejściowych to zewnętrzny obwód ochronny aplikacji internetowej. Chroni podstawową logikę biznesową, przetwarzanie danych i generowanie wyników. Dosłownie wszystko poza tym obwodem, z wyjątkiem kodu wykonywanego w ramach bieżącego żądania, jest uważane za terytorium wroga. Wszystkie możliwe wejścia i wyjścia z obwodu są strzeżone dzień i noc przez bojowych wartowników, którzy pierwsi strzelają, a później zadają pytania. Oddzielnie strzeżeni (i bardzo podejrzanie wyglądający) „sojusznicy” są podłączeni do obwodu, w tym „Model”, „Baza danych” i „System plików”. Nikt nie chce do nich strzelać, ale jeśli spróbują szczęścia... bum. Każdy sojusznik ma swój własny obwód, który może ufać naszemu lub nie.

    Pamiętasz, co mówiłem o tym, komu możesz zaufać? Do nikogo i do niczego. W świecie PHP porady, aby nie ufać „wkładom użytkownika” są wszędzie. Jest to jedna z kategorii ze względu na stopień zaufania. Zakładając, że użytkownikom nie można ufać, zakładamy, że można ufać wszystkiemu innemu. To jest źle. Użytkownicy są najbardziej oczywistym i niewiarygodnym źródłem informacji, ponieważ ich nie znamy i nie możemy ich kontrolować.

    Kryteria walidacji Walidacja danych wejściowych jest zarówno najbardziej oczywistą, jak i najbardziej zawodną ochroną aplikacji internetowej. Zdecydowana większość podatności powstaje w wyniku awarii systemu weryfikacji, dlatego bardzo ważne jest, aby ta część ochrony działała poprawnie. Może się to nie udać, ale nadal należy przestrzegać poniższych uwag. Podczas wdrażania niestandardowych walidatorów i korzystania z bibliotek walidacyjnych innych firm należy zawsze pamiętać, że rozwiązania innych firm zwykle wykonują zadania ogólne i pomijają kluczowe procedury sprawdzania poprawności, których może potrzebować Twoja aplikacja. Korzystając z bibliotek przeznaczonych do celów bezpieczeństwa, należy niezależnie sprawdzić je pod kątem luk w zabezpieczeniach i prawidłowego działania. Zalecam również pamiętać, że PHP może wykazywać dziwne i potencjalnie niebezpieczne zachowanie. Spójrz na ten przykład zaczerpnięty z funkcji filtrujących:

    Filter_var("php://example.org", FILTER_VALIDATE_URL);
    Filtr przechodzi bez żadnych pytań. Problem polega na tym, że otrzymany adres URL php:// może zostać przekazany do funkcji PHP, która oczekuje raczej otrzymania zdalnego adresu HTTP niż zwrócenia danych z wykonującego się skryptu PHP (poprzez procedurę obsługi PHP). Luka występuje, ponieważ opcja filtrowania nie udostępnia metody ograniczającej prawidłowe identyfikatory URI. Mimo że aplikacja oczekuje łącza http, https lub mailto, a nie jakiegoś URI specyficznego dla PHP. Za wszelką cenę należy unikać tego zbyt ogólnego podejścia do testowania.

    Zachowaj ostrożność podczas sprawdzania poprawności danych kontekstowych, która powinna zapobiegać wprowadzaniu niebezpiecznych danych do aplikacji internetowej. Główna przeszkoda: testy bezpieczeństwa danych są zwykle przeprowadzane tylko przy pierwszym zamierzonym użyciu.

    Załóżmy, że otrzymałem dane zawierające imię i nazwisko. Mogę to dość łatwo sprawdzić pod kątem apostrofów, łączników, nawiasów, spacji i całej gamy alfanumerycznych znaków Unicode. Nazwa jest ważnymi danymi, które można wykorzystać do wyświetlenia (pierwsze zamierzone użycie). Jeśli jednak użyjesz go gdzie indziej (na przykład w zapytaniu do bazy danych), trafi on do nowego kontekstu. A niektóre dozwolone w nazwie znaki okażą się niebezpieczne w tym kontekście: jeśli nazwa zostanie przekonwertowana na ciąg znaków w celu wykonania zastrzyku SQL.

    Okazuje się, że weryfikacja danych wejściowych jest z natury zawodna. Jest najbardziej skuteczny w odcinaniu wyraźnie nieprawidłowych wartości. Załóżmy, że coś musi być liczbą całkowitą, ciągiem alfanumerycznym lub adresem URL HTTP. Takie formaty i wartości mają swoje ograniczenia i jeśli zostaną odpowiednio zweryfikowane, rzadziej będą stanowić zagrożenie. Inne wartości (nieograniczony tekst, tablice GET/POST i HTML) są trudniejsze do zweryfikowania i częściej zawierają złośliwe dane.

    Ponieważ przez większość czasu nasza aplikacja będzie przesyłać dane między kontekstami, nie możemy po prostu sprawdzić wszystkich danych wejściowych i zakończyć to. Kontrola na wejściu to tylko pierwsza linia ochrony, ale bynajmniej nie jedyna.

    Oprócz sprawdzania danych wejściowych bardzo często stosuje się metodę ochrony, jaką jest ekranowanie. Za jego pomocą dane są sprawdzane pod kątem bezpieczeństwa przy wejściu w każdy nowy kontekst. Ta metoda jest zwykle używana do ochrony przed skryptami między witrynami (XSS), ale jest również wykorzystywana w wielu innych zadaniach, jako narzędzie filtrujące.

    Ekranowanie chroni przed błędną interpretacją przez odbiorcę danych wychodzących. Ale to nie wystarczy – gdy dane wchodzą w nowy kontekst, konieczne jest sprawdzenie konkretnie pod kątem konkretnego kontekstu.

    Chociaż może to być postrzegane jako powielanie początkowej walidacji danych wejściowych, dodatkowe etapy walidacji w rzeczywistości lepiej uwzględniają specyfikę bieżącego kontekstu, w którym wymagania dotyczące danych są bardzo różne. Na przykład dane pochodzące z formularza mogą zawierać liczbę procentową. Przy pierwszym użyciu sprawdzamy, czy wartość jest rzeczywiście liczbą całkowitą. Jednak po przeniesieniu do naszego modelu aplikacji mogą pojawić się nowe wymagania: wartość musi mieścić się w pewnym przedziale, który jest wymagany, aby logika biznesowa aplikacji działała. A jeśli ta dodatkowa kontrola nie zostanie przeprowadzona w nowym kontekście, mogą pojawić się poważne problemy.

    Używaj tylko białych list, a nie czarnych. Czarne i białe listy to dwa główne podejścia do sprawdzania poprawności danych wejściowych. Czarny oznacza sprawdzanie nieprawidłowych danych, a biały oznacza sprawdzanie poprawnych danych. Białe listy są preferowane, ponieważ podczas weryfikacji przesyłane są tylko te dane, których oczekujemy. Z kolei czarne listy uwzględniają jedynie założenia programistów na temat wszystkich możliwych błędnych danych, dlatego znacznie łatwiej jest się pomylić, przeoczyć coś lub popełnić błąd.

    Dobrym przykładem jest dowolna procedura sprawdzania poprawności zaprojektowana w celu zapewnienia bezpieczeństwa HTML pod względem niezmienionych danych wyjściowych w szablonie. Jeśli korzystamy z czarnej listy, to musimy sprawdzić, czy kod HTML nie zawiera niebezpiecznych elementów, atrybutów, stylów i wykonywalnego JavaScript. To dużo pracy, a narzędzia do czyszczenia HTML oparte na czarnych listach zawsze potrafią przeoczyć niebezpieczne kombinacje kodów. Narzędzia do tworzenia białych list eliminują tę dwuznaczność, dopuszczając tylko znane dozwolone elementy i atrybuty. Wszyscy inni zostaną po prostu oddzieleni, odizolowani lub usunięci, niezależnie od tego, czym są.

    Dlatego w przypadku wszelkich procedur weryfikacyjnych preferowane są białe listy ze względu na większe bezpieczeństwo i niezawodność.

    Nigdy nie próbuj poprawiać danych wejściowych Weryfikacji danych wejściowych często towarzyszy filtrowanie. Jeśli podczas weryfikacji po prostu ocenimy poprawność danych (dając wynik pozytywny lub negatywny), to filtrowanie zmienia sprawdzane dane tak, aby spełniały określone reguły.

    Zwykle jest to nieco szkodliwe. Tradycyjne filtry polegają na przykład na usuwaniu z numerów telefonów wszystkich znaków z wyjątkiem cyfr (w tym dodatkowych nawiasów i łączników) czy przycinaniu zbędnych odstępów w poziomie lub w pionie. W takich sytuacjach przeprowadza się minimalne czyszczenie, aby wyeliminować błędy w wyświetlaniu lub transmisji. Można jednak dać się ponieść filtrowaniu w celu blokowania złośliwych danych.

    Jedną z konsekwencji próby poprawienia danych wejściowych jest to, że osoba atakująca może przewidzieć wpływ wprowadzonych poprawek. Załóżmy, że istnieje niepoprawna wartość ciągu. Wyszukaj, usuń i zakończ filtrowanie. Co się stanie, jeśli osoba atakująca utworzy wartość oddzieloną ciągami znaków, aby przechytrzyć Twój filtr?

    alert(dokument.cookie);
    W tym przykładzie zwykłe filtrowanie według tagu nic nie da: usunięcie jawnego tagu spowoduje, że dane zostaną uznane za całkowicie prawidłowy element skryptu HTML. To samo można powiedzieć o filtrowaniu według dowolnego konkretnego formatu. Wszystko to wyraźnie pokazuje, dlaczego sprawdzanie danych wejściowych nie powinno być ostatnią pętlą bezpieczeństwa aplikacji.

    Zamiast próbować poprawiać wprowadzone dane, po prostu użyj modułu sprawdzania poprawności opartego na białej liście i całkowicie odrzuć takie próby wprowadzania danych. A tam, gdzie trzeba filtrować, zawsze filtruj przed sprawdzeniem, nigdy później.

    Nigdy nie ufaj zewnętrznym narzędziom do walidacji i stale monitoruj pod kątem luk. Zauważyłem wcześniej, że walidacja jest konieczna za każdym razem, gdy dane są przenoszone do nowego kontekstu. Dotyczy to również walidacji przeprowadzanej poza samą aplikacją webową. Należą do nich sprawdzanie poprawności lub inne ograniczenia stosowane do formularzy HTML w przeglądarce. Spójrz na ten formularz z HTML 5 (pominięte etykiety):

    Reprezentant. Irlandii Wielkiej Brytanii
    Formularze HTML mogą nakładać ograniczenia na wprowadzane dane. Możesz ograniczyć wybór za pomocą listy stałych elementów, ustawić wartości minimalne i maksymalne, a także ograniczyć długość tekstu. Możliwości HTML 5 są jeszcze szersze. Przeglądarki mogą sprawdzać adresy URL i adresy e-mail oraz kontrolować daty, liczby i zakresy (chociaż obsługa dwóch ostatnich jest dość nierówna). Przeglądarki mogą także sprawdzać poprawność danych wejściowych przy użyciu wyrażeń regularnych JavaScript zawartych w atrybucie szablonu.

    Biorąc pod uwagę wszystkie te elementy sterujące, należy pamiętać, że ich celem jest poprawa użyteczności aplikacji. Każdy atakujący może utworzyć formularz, który nie zawiera ograniczeń z oryginalnego formularza. Możesz nawet utworzyć klienta HTTP do automatycznego wypełniania formularzy!

    Innym przykładem zewnętrznych narzędzi do walidacji jest odbieranie danych z interfejsów API stron trzecich, takich jak Twitter. Ta sieć społecznościowa cieszy się dobrą reputacją i zwykle można jej zaufać bez wątpienia. Ale ponieważ mamy paranoję, nie powinniśmy nawet ufać Twitterowi. W przypadku naruszenia jego odpowiedzi będą zawierać niebezpieczne dane, na które nie będziemy przygotowani. Dlatego nawet tutaj używaj własnego czeku, aby nie być bezbronnym, jeśli coś się stanie.

    Tam, gdzie mamy zaufanie do zewnętrznych narzędzi weryfikacji, wygodnie jest monitorować podatności. Na przykład, jeśli formularz HTML ustawia maksymalny limit długości i otrzymamy dane wejściowe, których rozmiar osiągnął ten limit, logiczne jest założenie, że użytkownik próbuje ominąć sprawdzanie. W ten sposób możemy rejestrować luki w zewnętrznych narzędziach i podejmować dalsze działania przeciwko potencjalnym atakom, ograniczając dostęp lub liczbę żądań.

    Unikaj konwersji typów w PHP PHP nie jest językiem o jednoznacznie typowanym typie i większość jego funkcji i operacji jest niebezpieczna dla typów. Może to prowadzić do poważnych problemów. Co więcej, to nie same wartości są szczególnie wrażliwe, ale walidatorzy. Na przykład:

    Assert(0 == "0ABC"); //zwraca PRAWDĘtwierdzenie(0 == "ABC"); //zwraca PRAWDĘ (nawet bez liczby na początku!) accord(0 === "0ABC"); //zwraca NULL/Ostrzega o niemożności sprawdzenia wyciągu
    Projektując walidatory pamiętaj o zastosowaniu ścisłych porównań i ręcznej konwersji typów, gdy wartością wejściową lub wyjściową może być ciąg znaków. Na przykład formularze mogą zwracać ciąg znaków, więc jeśli pracujesz z danymi, które muszą być liczbą całkowitą, pamiętaj o sprawdzeniu ich typu:

    Funkcja checkIntegerRange($int, $min, $max) ( if (is_string($int) && !ctype_digit($int)) (zwraca wartość false; // zawiera znaki niecyfrowe) if (!is_int((int) $int )) ( return false; // inna wartość niecałkowita lub większa PHP_MAX_INT ) return ($int >= $min && $int = $min && $int array("verify_peer" => TRUE))); $body = file_get_contents("https://api.example.com/search?q=sphinx", false, $context);
    UPD. W PHP 5.6+ opcja ssl.verify_peer jest domyślnie ustawiona na TRUE.

    Rozszerzenie cURL obejmuje sprawdzanie serwera od razu po wyjęciu z pudełka, więc nie musisz niczego konfigurować. Jednak programiści czasami bezmyślnie podchodzą do bezpieczeństwa swoich bibliotek i aplikacji. Takie podejście można znaleźć w dowolnych bibliotekach, od których będzie zależeć Twoja aplikacja.

    Curl_setopt(CURLOPT_SSL_VERIFYPEER, fałsz);
    Wyłączenie weryfikacji serwera w kontekście SSL lub podczas korzystania z metody curl_setopt() spowoduje podatność na ataki typu man-in-the-middle. Ale jest wyłączany właśnie po to, aby rozwiązać problem irytujących błędów wskazujących na atak lub próbę skontaktowania się aplikacji z hostem, którego certyfikat SSL jest nieprawidłowo skonfigurowany lub wygasł.

    Aplikacje internetowe, takie jak klient Twittera, często mogą działać jako serwer proxy dla aktywności użytkownika. Jedyne, co możemy zrobić, to utrzymywać nasze aplikacje zgodnie z wysokimi standardami wyznaczanymi przez przeglądarki, które ostrzegają użytkowników i starają się chronić ich przed połączeniem się z podejrzanymi serwerami.

    Wnioski Często mamy wszystkie możliwości, aby stworzyć bezpieczną aplikację. Ale sami omijamy pewne rozsądne ograniczenia, aby ułatwić rozwój, debugowanie i wyłączyć wyświetlanie irytujących błędów. Albo w dobrych intencjach staramy się niepotrzebnie komplikować logikę aplikacji.

    Ale hakerzy nie jedzą chleba na próżno. Szukają nowych sposobów na ominięcie naszych niedoskonałych zabezpieczeń i badają luki w modułach i bibliotekach, których używamy. A jeśli naszym celem jest stworzenie bezpiecznej aplikacji internetowej, to ich celem jest naruszenie naszych usług i danych. Ostatecznie wszyscy pracujemy nad udoskonalaniem naszych produktów.

    Chcesz określić najlepszy czas na poczęcie, zapobiec niechcianej ciąży lub dowiedzieć się, kiedy seks z partnerem będzie najlepszy? Wcześniej kobiety musiały udać się na konsultację do lekarza, ale teraz mają nowego najlepszego przyjaciela – smartfona.

    W ostatnich latach pojawiło się wiele aplikacji dla kobiet, które ułatwiają śledzenie dni płodnych i godzin owulacji, a także tworzenie osobistych notatek. Oprócz tego mają wiele innych funkcji. Jedną z takich aplikacji jest Glow, z której korzysta już 47 milionów kobiet. Glow umożliwia śledzenie nastrojów kobiet oraz jakości i częstotliwości seksu. Dzięki tej aplikacji możliwe jest poznanie tych ciekawych faktów z życia intymnego kobiet z całego świata.

    Najlepsze kraje dla kobiet

    1. Brakuje Ci intymności? Jedź do Kanady. Okazuje się, że Kanadyjki uprawiają seks 45% częściej niż przeciętni użytkownicy aplikacji.

    2. Ale bądź ostrożny: Kanada to świetne miejsce na zajście w ciążę. Kanadyjki mogą zajść w ciążę o 21% łatwiej niż inne.

    3. Australijki również często uprawiają seks – o 37% więcej niż przeciętni użytkownicy aplikacji.

    4. Nie trzeba dodawać, że kobiety w Australii również mają duże szanse na zajście w ciążę? Są o 14% wyższe od pozostałych użytkowników.

    5. USA to dobre miejsce na szczęście. Amerykanki uprawiają seks o 16% częściej niż inne kobiety.

    6. Najgorsze miejsce do bycia szczęśliwym? Ameryka Łacińska. Tutaj kobiety uprawiają seks o 4% rzadziej niż przeciętni użytkownicy aplikacji.

    Apetyty seksualne

    1. Apetyt seksualny kobiety odpowiada jej cyklowi miesięcznemu. Pierwszy dzień cyklu to pierwszy dzień miesiączki, która trwa około pięciu dni. Dlatego kobiety są najmniej zainteresowane seksem przez jeden do pięciu dni w miesiącu.

    2. Wiele kobiet zgłasza w tym czasie zmiany poziomu energii lub nastroju, co zwykle wiąże się ze spadkiem popędu seksualnego. Kobiety są również mniej zainteresowane seksem przez cały tydzień po okresie.

    3. Większość kobiet zaczyna ponownie uprawiać seks w 12. dniu cyklu.

    4. Wiele kobiet utrzymuje regularne stosunki seksualne od 12 do 14 dni cyklu. Aplikacja Glow nazywa te dni „szczytem seksowności”.

    5. Kobiety czują się najbardziej seksownie w 13. i 14. dniu cyklu. Ale oto interesująca rzecz: niekoniecznie mają w tym czasie najlepszy, najbardziej satysfakcjonujący seks.

    6. Kobiety najbardziej lubią seks w ostatnim, 30. dniu cyklu. Ten dzień w Glow nazywany jest „szczytowym orgazmem”.

    Czy kobiety są zadowolone?

    1. Kobiety czują się najszczęśliwsze w 15. i 16. dniu cyklu, a także wtedy, gdy w poprzednich dniach uprawiały dużo seksu.

    2. Użytkownicy Glow zarejestrowali 7,6 miliona kontaktów seksualnych w ciągu dwóch lat.

    3. Oznacza to, że co minutę co najmniej siedem kobiet korzystających z aplikacji Glow uprawia seks.

    4. Nawiasem mówiąc, użytkownicy również zgłosili swoje zauroczenie 2 miliony razy. Aplikacja śledzi także cykle płciowe i płodność 88 000 par.

    5. Niestety, pomimo istniejących kontaktów seksualnych, nie wszystkie kobiety są z nich zadowolone. Prawie co trzecia kobieta wolałaby zrezygnować z seksu niż ze smartfona.

    6. Ale to wciąż oznacza, że ​​dwie trzecie wolałoby zrezygnować z telefonu niż z seksu.

    Dołącz do dyskusji
    Przeczytaj także
    Informacja dla rodziców uczniów
    Kłoski dla średnich włosów - skromne i niezwykle piękne Fryzura z dwoma dużymi kłoskami
    Radziecka organizacja Komsomołu weszła w kronikę bohaterskiej historii współczesnej Rosji