Menu
Jest wolny
Zameldować się
główny  /  Internet / Sesja. Sesje monitorowania, hasła aplikacji i potwierdzenie wejścia na sesji aktywnej na Facebooku

Sesja. Sesje monitorowania, hasła aplikacji i potwierdzenie wejścia na sesji aktywnej na Facebooku

Serwer WWW nie obsługuje stałego połączenia z klientem, a każde żądanie jest przetwarzane jako nowe, bez żadnego połączenia z poprzednią.
Oznacza to, że nie można śledzić żądań z tego samego odwiedzającego, ani zapisywać zmiennych między oglądaniem poszczególne strony.. Tutaj, aby rozwiązać te dwa zadania, sesje zostały wymyślone.
W rzeczywistości sesja, jeśli w skrócie - jest to mechanizm, który umożliwia jednoznacznie zidentyfikować przeglądarkę i tworzenie pliku dla tej przeglądarki na serwerze, w którym przechowywane są zmienne sesji.

Nie będę szczegółowo pomalować w takim mechanizmie. Są to taką sprawę podróżnika, jak wózek na zakupy w e-sklepie, autoryzacja, a także nie dość trywialne problemy, takie jak ochrona interaktywnych części witryny ze spamu.

Zasadniczo jest to dość łatwe, aby tworzyć własne analog sesji, a nie jako funkcjonalne, jak wbudowane w PHP, ale podobnie w istocie. Na pliki cookie i bazy danych.
Po wyświetleniu skryptu, widzimy, czy kucharz przyszedł z określoną nazwą. Jeśli nie ma plików cookie, umieść go i napisz nową linię do bazy danych za pomocą danych użytkownika. Jeśli jest kucharz, czytamy dane z bazy danych. Usuwamy stare rekordy z podstawy z bazy i tutaj jesteśmy gotowi do mechanizmu sesji. Jest całkowicie łatwy. Ale istnieją pewne niuanse, które preferują stosowanie wbudowanego mechanizmu sesji.

Jeśli tylko pierwszy jest włączony, wtedy, gdy rozpoczniesz sesję (za każdym razem, gdy zadzwonisz session_start ()) Cook jest zainstalowany klientowi. Przeglądarka prawidłowo na każdej prośbie, w tym zwrotu, a PHP ma identyfikator sesji. Problemy rozpoczynają się, jeśli przeglądarka Cook nie powraca. W tym przypadku, bez odbierania plików cookie z identyfikatorem, PHP rozpocznie nową sesję przez cały czas, a mechanizm nie będzie działał.

Gdyby tylko drugi jest wliczony, to kucharz nie jest wystawiony. I tak się dzieje, w rzeczywistości warto korzystać z wbudowanego mechanizmu sesji. Po tym, jak skrypt wykonuje swoją pracę, a strona jest w pełni utworzona, PHP wyświetli go wszystko i dodaje do każdego linku i do każdego formularza do przesyłania identyfikatora sesji. To wygląda tak:
Indeks zmienia się w
Indeks
a formularze dodają ukryte pole

A przeglądarka przy kliknięciu na dowolny link lub po kliknięciu przycisku w formularzu wyślij nam zmienną w zapytaniu - identyfikator sesji!
Ze względu na oczywiste powody identyfikator jest dodawany tylko do względnych linków.

Teoretycznie, w naszych domowych sesjach na plikach cookie i bazy danych, możesz przypisać wszystkie odniesienia do identyfikatora - a następnie nasze własne sesje będą działać niezależnie od kucharza. Ale widzisz - bardziej przyjemny, gdy ktoś inny robi tę pracę? ;-)

Domyślny B. ostatnie wersje. PHP zawiera obie opcje. Jak pojawia się PHP w tym przypadku? Kucharz jest zawsze wystawiany. I linki łącze tylko wtedy, gdy RNR nie znalazł kucharza z identyfikatorem sesji. Gdy użytkownik w krótkim czasie dla tej sesji przychodzi do witryny, jest on wykonany przez kucharza, a linki są uzupełniane. Przy następnym zapytaniu, jeśli obsługiwane są pliki cookie, PHP widzi gotowanie i przestaje uzupełniać linki. Jeśli pliki cookie nie działają, wtedy PHP kontynuuje odpowiednio dodać identyfikator do linków, a sesja nie zostanie utracona.
Użytkownicy, którzy mają pliki cookie, zobaczą długi link z identyfikatora tylko raz.

Fuh. Z zakończeniem transferu identyfikatora.
Teraz pozostaje związany z plikiem z danymi po stronie serwera.
PHP zrobi to dla nas. Wystarczy zapisać
session_start ();
$ _SESSION ["Test"] \u003d "Hello World!" ;

A PHP napisze do pliku powiązanego z tym sesją, zmienną testową.
Oto bardzo ważna uwaga.
Szyk $ _SESSION. - Specjalny.
W rzeczywistości istnieją zmienne, które udostępniamy w różnych skryptach.
Aby umieścić zmienną w sesji, wystarczy przypisać go element array $ _Session.
Aby uzyskać jego wartość - wystarczy zastosować do tego samego przedmiotu. Przykład będzie nieco niższy.

Śmieciarki - usunięcie przestarzałego pliki PHP. Również zaangażowany w siebie. Jak w przypadku kodowania danych i kilka innych niezbędnych rzeczy. W wyniku tego problemu praca z sesjami okazuje się bardzo proste.
W rzeczywistości przychodzimy do przykładu pracy sesji.
Przykład jest bardzo mały:
session_start ();

echo. "Zaktualizowałeś tę stronę". $ _SESSION ["Counter" ++. "Pewnego razu.";
echo "
aktualizacja ";
?>

Sprawdzamy, czy mamy zmienną licznik w sesji, jeśli nie, wówczas tworzymy go o wartości 0, a następnie czerpiemy jego wartość i zwiększa urządzenie. Powiększona wartość jest rejestrowana na sesji, a następnym razem, gdy zadzwonisz do skryptu zmienna będzie 1, i tak dalej.
Wszystko jest bardzo proste.

Aby mieć dostęp do sesji zmiennej na dowolnych stronach witryny, musisz napisać tylko jeden (!) Lokalizacja na początku każdego pliku, w którym potrzebujemy sesji:
session_start ();
I dalszy dostęp do elementów tablicy $ _SESSION. Na przykład sprawdzenie autoryzacji będzie wyglądać w ten sposób:
session_start ();
jeśli ($ _Session ["Autoryzowany"]<> 1 ) {
nagłówek ("Lokalizacja: /auth.php");
wyjście;
}

Usuń zmienne z sesji.
Jeśli masz rejestrację_globals \u003d off, możesz pisać
nieznacznie ($ _ sesja ["var"]);
Jeśli nie wtedy blisko Konieczne jest napisanie z nim
session_unregister ("var");

Najczęstsze błędy, które dają PRP podczas próby pracy z sesjami:
Dwoje z nich,
OSTRZEŻENIE: Nie można sesji cookie - nagłówki już wysłane
OSTRZEŻENIE: Nie można sesji limiter pamięci podręcznej sesji - nagłówki już wysłane

spowodowane tym samym powodem rozwiązanie opisano w tym FAK
Trzeci
OSTRZEŻENIE: Open (/ TMP SESSID, O_RDWR) nie powiodło się: brak takiego pliku lub katalogu (2) w full_script_path na numerze linii (Wcześniej wyglądała OSTRZEŻENIE: Nie można pisać danych sesji (plików). Sprawdź, czy bieżące ustawienie session.save_path jest poprawne (/ TMP)),
Jeśli tłumaczysz go z języka angielskiego, wyjaśnia szczegółowo problem: ścieżka określona w PHP.ini jest niedostępna do katalogu, w którym zapisywane są pliki sesji. Ten błąd naprawia najłatwiejszy sposób. Wystarczy zarejestrować katalog, który istnieje i jest dostępny do nagrywania, na przykład,
session.save_path \u003d c: okna
I nie zapomnij ponownie uruchomić apache po tym.

Jak się okazuje, inteligencja człowieka nie ma ograniczeń, a zatem muszę wyjaśnić:
Trzeci komunikat o błędzie (nie można znaleźć katalogu) nieuchronnie doprowadzi do pojawienia się pierwszych dwóch, ponieważ komunikat o błędzie jest wyjściem do przeglądarki i po tym, jak jest niemożliwe do użycia nagłówków. Dlatego nie spiesz się, aby szukać przedwczesnego wniosku i najpierw napisz odpowiedni sposób!

Kolejny problem częstości występowania podczas pracy z sesjami jest ciężki starsi Register_globals. Nie podawaj zmiennych skryptów nazw, które pasują do indeksów tablicy $ _Session!
Gdy zarejestruj się_globals \u003d włączony, wartości nadpisują się wzajemnie, a jesteś zdezorientowany.
A gdy zarejestruje się pojawi się kolejny błąd: "Skrypt prawdopodobnie opiera się na efekcie ubocznym sesji, który istniał do PHP 4.2.3." W przypadku, gdy istnieje zmienna sesja w skrypcie, a zmienna globalna z zmienną globalną z ta sama nazwa. Aby się go pozbyć, zawsze powinieneś zainicjować zmienne przed użyciem (lub przynajmniej sprawdzić istnienie), a nie dać globalnych nazw zmiennych, które pasują do indeksów tablicy $ _Session.

Jeśli nie działa, ale nie są wyświetlane żadne wiadomości, a następnie dodaj dwie linie do samego początku skryptu, które są odpowiedzialne za wyjście wszystkich błędów na ekranie - jest całkiem możliwe, że istnieją błędy, ale po prostu nie T ich zobacz.
ini_set ("Display_errors", 1);
eRROR_REPORTING (E_ALL);

Lub zobacz błędy w ERROR_LOG. Ogólnie rzecz biorąc, temat wyświetlania komunikatów o błędach wykracza poza zakres tego artykułu, więc po prostu upewnij się, że przynajmniej możesz je zobaczyć. Nieco skręcanie do wyszukiwania błędów można znaleźć w tej sekcji.

Jeśli jesteś pewien, że nie ma błędów, ale powyższy przykład i tak nie działa, to możliwe jest, że PHP nie jest zawarty w PCCle Przejdź przez ul, i ciasteczka z jakiegoś powodu nie działają.
Zobacz, co masz z plikami cookie.
Ogólnie rzecz biorąc, jeśli "nie działasz" sesji, najpierw spróbuj przenieść identyfikator sesji rękami, czyli, wykonaj link i atrybut identyfikatora IT:
session_start ();
jeśli (! Isset ($ _ sesja ["Counter"])) $ _Session ["Counter"] \u003d 0;
echo. "Zaktualizowałeś tę stronę". $ _SESSION ["Counter" ++. "Pewnego razu.

aktualizacja ";
?>

Należy zweryfikować, że dyrektywa w sprawie sesji

Jeśli ten przykład nie zarabia, problem jest albo w banalnym literówki (Połowa "Problemy" ze sesjami pochodzi z nieprawidłowo pisemnej nazwy zmiennej), czy też stara wersja PHP: Obsługa sesji pojawiła się w wersji 4.0 i tablicy $ _SESSION. - w 4.1 (przed użyciem $ Http_session_vars.).
Jeśli to działa, problem jest w plikach cookie. Śledzenie - jaką wiązka jest umieszczona przez serwer do przeglądarki, czy przeglądarka go zwraca. Wyszukiwanie jest bardzo pomocne, patrząc przez oglądanie wymiany nagłówków HTTP między przeglądarką a serwerem.
Wyjaśnienie zasady pracy kucharza wykracza poza zakres tego i tak duży tekst, ale przynajmniej upewnić się, że serwer kucharza z identyfikatorem wysyła identyfikator, a przeglądarka powróci. I jednocześnie identyfikatory zbiegają się ze sobą \u003d)
Instalowanie plików cookie powinno wyglądać
Set-Cookie: Phpsesid \u003d PRLGDFBVLG5FBSBSHCH6HJ0CQ6;
albo jak
Set-Cookie: Phpsesid \u003d PRLGDFBVLG5FBSBSHCH6HJ0CQ6; ścieżka \u003d /
(Jeśli zażądasz skryptu nie z katalogu korzenia)
Odpowiedź serwera powinna wyglądać
Cookie: Phpssid \u003d PRLGDFBVLG5FBSBSHCH6HJ0CQ6
lub
Cookie: Phpsesid \u003d PRLGDFBVLG5FBSBSHCH6HJ0CQ6; B \u003d B.
Jeśli przeglądarka zwraca inne pliki cookie, z wyjątkiem identyfikatora sesji.

Jeśli przeglądarka bukiet nie wróci - sprawdź, czy w ogóle działają pliki cookie.
Upewnij się, że domena, do której odwołasz, ma mieć normalną nazwę (w której znajduje się co najmniej jeden punkt i nie zawiera zabronionych znaków, takich jak podkreślenia) i czyszczenia pamięci podręcznej przeglądarki - są to dwa główne przyczyny plików cookie mogą nie działać .

Jeśli przykład działa stąd, a twój własny kod nie jest, problem jest oczywiście nie w sesjach, ale w algorytmie. Poszukaj, gdzie straciłeś zmienną, ponad kroki przetrwalają przykład, debuguj skrypt.

Kolejny problem może wystąpić, jeśli używasz przekierowania przez nagłówek lub nawigację przy użyciu JavaScript.
Faktem jest, że RNR automatycznie dodaje identyfikator sesji tylko do odniesień gatunków Ale nie czyni go za nagłówek, JavaScript, Meta Tags.
Dlatego musisz dodać identyfikator rękoma, na przykład w następujący sposób:
nagłówek ("Lokalizacja: /script.php?" Session_name (). "\u003d". Session_id ());

Również bardzo rzadko i całkowicie niezrozumiały, skąd pojawiający się problem polega na tym, że sesja.Save_handler ustawienia ma wartość inną niż pliki. Jeśli nie jest tak - popraw.

Bezpieczeństwo
Sesje bezpieczeństwa - temat jest rozległy. Dlatego zatrzymam się w kilku głównych punktach.
Najbardziej hostowany - nie przekazując identyfikatora wiersz adresu. Jest to napisane nawet w php.ini, ale ogranicza funkcjonalność sesji. Jeśli zdecydujesz się przestrzegać tej rady, z wyjątkiem session.use_trans_sid \u003d 0 Nie zapomnij session.use_only_cookies \u003d 1
Zaleca się wiązanie sesji na adres IP: w ten sposób, jeśli zostanie skradziony identyfikator, złoczyńca nadal nie będzie w stanie ich używać w większości przypadków.
Zaleca się korzystanie z dyrektywy session.save_path, z którą należy określić własny katalog, aby zapisywać pliki sesji. Jest to bezpieczne niż gdy są przechowywane w ogólnym tymczasowym katalogu serwera domyślnego.

Dodatkowe informacje:

  • Oprócz gotowania mechanizm sesji wysyła również nagłówki, które zabierają buforowanie stron (tym samym ogranicznika pamięci podręcznej). W przypadku HTML jest poprawny i konieczny. Ale kiedy próbujesz podać skrypt, który weryfikuje autoryzację, wyślij plik, a następnie Internet Explorer odmówi go pobrania. To z powodu tego nagłówka. Połączenie
    session_cache_limiter ("prywatny");
    Przed rozpoczęciem sesji powinien rozwiązać problem.
  • Ponieważ wydaje się dziwne, ale w tablicy $ _SESSION. Nie można używać indeksów numerycznych - $ _Session [1], $ _Session ["10"] - Consissions nie będą działać.
  • Gdzieś między wersjami 4.2 i 5.0 nie można było zainstalować session.use_trans_SID za pomocą ini_set () . Począwszy od 5.0, możesz już ponownie.
  • Przed wersją 4.3.3 gotuj PHP. Wysłałem tylko kilka, jeśli sesja zaczyna się w zapytaniu, nie było identyfikatora. Teraz kucharz jest wysyłany za każdym razem. session_start ()

    Przykład autoryzacji przy użyciu sesji
    Zilustrujemy wszystko wybrane przez mały przykład:
    Utwórz plik-auth.php:
    jeśli (Isset ($ _ Post ["Auth_name"])))
    {
    $ Sql \u200b\u200b\u003d. "Wybierz * od użytkowników, w których nazwa \u003d";
    $ Row \u003d $ DB -\u003e GetROW ($ SQL, $ _Post ["Auth_name"]);
    Jeśli ($ Row && Password_verify ($ _post ["auth_pass"], $ wiersz ["Pass"])) (
    $ _SESSION ["User_id"] \u003d $ rzędu ["ID"];
    }
    nagłówek ("Lokalizacja: http: //". $ _Server ["http_host"]. $ _Server ["prośba_uri"]);
    Wyjście;
    }

    jeśli (Isset ($ _ Pobierz ["Akcja"]) i $ _get ["Action"] \u003d\u003d "Wyloguj") (
    session_start ();
    session_destroy ();
    nagłówek ("Lokalizacja: http: //". $ _Server ["http_host"]. "/");
    Wyjście;
    }

    jeśli (! ISET ($ _ sesja ["user_id"])) (
    ?>








    wyjście;
    }

    Teraz wystarczy pisać we wszystkich chronionych skryptach
    wymagają "auth.php";
    W tym przykładzie zakłada się, że sesja już się rozpoczęła, a połączenie z bazą danych jest tworzone przy użyciu klasy bezpiecznej i wygodnej pracy z MySQL. Zakłada się również, że hasło jest wymyślone przy użyciu zalecanej funkcji hasła_hash.
    Przykład chronionego pliku:

    session_start ();
    obejmują "safemysql.class.php";
    $ DB \u003d Nowy Safemysql (["DB" \u003d\u003e "Test"]);
    obejmują "auth.php";
    ?>
    sekret.

    wyloguj.

    Ops! Bardzo przydatne linki:
    http://www.php.net/manual/ru/ref.session.php to najnowsze i najnowsze informacje na temat wsparcia sesji w PHP w oficjalnej dokumentacji oraz liczne komentarze użytkownika. Silnie zaleca się czytanie.
    http://phpclub.ru/manrus/f/ref.session.html jest bardzo przestarzały tłumaczenie tego rozdziału w języku rosyjskim, z dokumentacji w tłumaczeniu Aleksandra piramidyny.
    http://phpclub.ru/detail/article/sessions.
    Artykuł z życzliwym tytułem "Prawda na sesjach". Podwójne liście wrażenie. Początkowo autor bardzo przystępne rozmowy o mechanizmie sesji, ale metody, które sugeruje do końca artykułu, są całkowicie błotniste.

    Artykuł chromentowy Dmitry Borodin z witryny
    http://php.spb.ru/ jest pilny niezalecany.
    Faceci, jest strasznie przestarzała. Nie wystarczy, że istnieją w nim rzeczywiste niedokładności, więc z sesjami w PHP przez długi czas po prostu nie działają.
    Dziękuję bardzo dla niej, był to pierwszy artykuł na sesjach w języku rosyjskim, sam na to studiowałem, ale teraz konieczne jest wysłanie go do zasłużonego odpoczynku.
    Ponadto niestety, a wiele innych artykułów leżących w Internecie i nie odnowiony przez lata.

  • Spójrzmy na coś jako sesję (sesja HTTP, sesja). Lub inaczej, sesja użytkownika. Dlaczego ważne jest zrozumienie mechanizmu pracy sesji. I zobaczmy, jak możesz pracować z państwami sesji na platformie ASP.NET.

    Zanim damy definicję terminu "sesja", spójrzmy na prehistorię trochę, dlaczego potrzeba sesji, weźmiemy jedną funkcję protokołu HTTP.

    Jedną z głównych cech protokołu HTTP jest to, że nie zobowiązuje serwera, aby zapisać informacje o kliencie między żądaniami, czyli identyfikację klienta. Jest to tak zwany protokół bezpaństwowy. Związek między klientem a serwerem kończy się natychmiast po zakończeniu przetwarzania bieżącego zapytania. Każda nowa prośba do serwera jest przeznaczona jako absolutnie wyjątkowa i niezależna, nawet jeśli została wysłana ponownie z tego samego źródła.

    Co jeśli zostawisz ustawową naturę protokołu HTTP i nie identyfikujesz użytkownika? Bez stanów sesji można łatwo zrobić, jeśli Twoja witryna jest reprezentowana przez statyczne (zdumienne) informacje, na przykład artykuł informacyjny składający się z tekstu i obrazów. W takim kontekście jest absolutnie opcjonalnie kojarzyć kilka żądań z jednym użytkownikiem. W końcu treść artykułu nie zmieni się w żaden sposób, czy dziesięć żądań z jednego urządzenia lub dziesięciu żądań od różnych osób z różnych urządzeń.

    Ale jak tylko zamierzamy przenieść dane osobowe na serwerze, musimy jakoś sprawić, że serwer kojarzy wszystkie nasze prośby od nas, aw przyszłości zdefiniował wszystkie żądania od nas. Jeśli tego nie zrobi, z każdym nowym żądaniem będziemy zmuszeni ponownie przesłać niezbędne dane osobowe. Na przykład zaloguj się, aby wejść osobisty obszar Na stronie lub takich informacjach jako nazwa, adres wysyłki, przy dokonywaniu zakupu w sklepie internetowym.

    Jest to tylko w takich sytuacjach, gdy trzeba spersonalizować prośby z jednego klienta, użyjemy sesji.

    Sesja (sesja) - Jest to pewna długość w czasie, w której aplikacja internetowa może zdefiniować wszystkie żądania od jednego klienta.

    Gdy klient najpierw przesyła dane osobowe w zapytaniu, na serwerze utworzono nową sesję na serwerze dla tego klienta. W trakcie życia sesji wszystkie prośby z tego klienta zostaną jednoznacznie rozpoznane i związane z nią. Po tym czasie zostanie utracona komunikacja z klientem, a następne żądanie zostanie przetworzone jako absolutnie wyjątkowe, w żaden sposób związane z poprzednim.

    Na przykład, przy dokonywaniu zakupu w sklepie internetowym, dane osobowe użytkownika są zapisywane w sesji, podczas gdy podróżuje przez witrynę. Są one wybrane produkty w koszyku, adres dostawy, dane kontaktowe i tak dalej.

    Teraz zobaczmy, jak możemy to wdrożyć technicznie. Ogólnie istnieje kilka technik zarządzania sesji klienta, ich liczbę i metodę wdrażania w dużej mierze zależy od platformy internetowej lub technologii, które działa na serwerze. W tej lekcji uważamy następujące czynności:

    1. ukryte pola na HTML (pola ukrytych form)
    2. pliki cookie (ciasteczka)
    3. sesja (sesja, stan sesji)

    Spróbujmy wdrożyć je za pomocą platformy ASP.NET. Należymy krótko rozważmy pierwsze dwa mechanizmy, a szczególna uwaga zostanie wypłacona trzeciej, jako bardziej niezawodna, wygodna i bezpieczna.

    Ukryte pola na HTML (pola ukrytych form)

    Istotą tego podejścia jest to, że zapewniamy nawigację za pośrednictwem witryny za pomocą standardowej formy HTML. A przy każdym następnym żądaniu przechowujemy dane z poprzedniego w ukrytych dziedzinach na formularzu. Na przykład:

    @ Iusing (HTML.beginform ("Forms2", "Home", formmethod.post)) (

    Zamów naczynia

    }

    Public ActionResult Forms2 () (ViewBag.username \u003d żądanie.form ["Nazwa użytkownika"]; Widok zwrotny ();)

    @ Iusing (html.beginform ("Forms3", "Home", formmethod.post)) (

    @ ($ "Dobre popołudnie (ViewBag.username)! Co zamówisz?")

    }

    W tym przykładzie otrzymujemy nazwę użytkownika w pierwszej formie HTML. Następnie w kontrolerze w metodzie Forms2 () Usuwamy tę wartość z kolekcji Formularz i przekazuj do reprezentacji przez obiekt ViewPag.. W tym widoku wygenerowany jest kod nowa forma W ukrytym polu nazwa użytkownika jest zapisywana. W ten sposób wartość nazwy użytkownika zostanie przekazana w trzecim kształcie po więcej informacji - Wartość pola nazwana "Foodname". Itp.

    Rozważmy cechy tego podejścia. Istnieją praktycznie żadne zalety, z wyjątkiem tego, że ta technika może być bardzo szybko wdrażana. Ale znowu, inne podejścia można również szybko wdrażać. Ale są minusy i całkiem niezbędne:


    Pliki cookie (ciasteczka)

    Public ActionResult Cookies2 () (httpcookie cookie \u003d new httpcookie ("nazwa użytkownika", httputility.urlenodode (żądanie.form ["nazwa użytkownika"]); cookie.expires \u003d datetime.utcnow.addhours (1); Cookie); Widok zwrotny ();)

    @ Iusing (html.beginform ("ciasteczka3", "dom", formmethod.post) (

    @ ($ "Dobre popołudnie (httputility.urldecode (prośba.cookies [" Nazwa użytkownika "] ?. Wartość))! Co zamówisz?")

    }

    W to podejście Nie przechowujemy danych sesji bezpośrednio na formularzu, zamiast tego używa standardowej pracy skoroszytu między klientem a serwerem. W plikach cookie i przechowywane wszystkie dane użytkownika.

    Po wybraniu tego podejścia, głównym problemem bezpieczeństwa pozostaje bezpieczeństwem naszych danych, które przekazujemy na serwerze - są łatwe do wymiany lub kradzieży, leżą otwórz wideo. Ponadto, jeśli ustawienia prywatności przeglądarki klienta odłączyły się od witryn z witryn, ta opcja nie będzie działać.

    Zatem niezwykle zaleca się przesyłanie ważnych i tajnych danych na dwa dwa sposoby, takie jak loginy, hasła, numery kart, kont, dane paszportowe, miejsce zamieszkania itp.

    Mechanizm zarządzania sesją serwera (sesja, sessionstate)

    Przeanalizujemy sposób pracuje mechanizm sesji z boku serwera i od klienta.

    Dla ustawienia standardowe Operacje statusu sesji do śledzenia serii zapytań z jednego klienta jest używany przez tzw. Cookie sesji. Algorytm jest następujący:

    1. Absolutnie dla każdego nowego żądania do serwera (bez względu na różni klienci lub jeden) ASP.NET generuje unikalny identyfikator sesji.
      Identyfikator sesji jest losowo wygenerowanym numerem zakodowanym algorytmem specjalnym w ciągu długości 24 znaków. Ciąg składa się z literałów z A do Z w małych literach, a także liczby od 0 do 5. Przykładowy identyfikator - HJNYUIJL1PAM3VOX2H5I41IN
    2. Jeśli podczas bieżącego żądania dane klienta nie są zapisywane w celu dalszego współpracy z nim, żywotność tego klienta kończy się (faktycznie bez uruchamiania). Jednocześnie wcześniej wygenerowany identyfikator sesji staje się nieprawidłowy (ponieważ nie został użyty). W odpowiedzi na taki wniosek, klient nie otrzymuje niczego do skojarzenia nowej sesji.
    3. Jeśli dane klienta (na przykład nazwa, adres dostawy towarów) jest zapisywany na serwerze, ASP.NET łączy zapisane dane z wcześniej generowanego identyfikatora sesji. Poniżej znajduje się specjalna sesja cookie, a ten identyfikator jest również rejestrowany. Ten plik cookie jest dodawany w odpowiedzi na żądanie i zapisany w przeglądarce klienta. W związku z tym połączenie klienta jest tworzone i jego spersonalizowane informacje na serwerze. Nowa sesja dla ten klient. Utworzony.
    4. Za każdym razem, gdy następne zapytanie, klient wysyła osobisty identyfikator sesji na serwer za pośrednictwem plików cookie. Serwer porównuje identyfikatory i "rozpoznaje" Klienta w ramach bieżącej sesji.
    5. Dopóki klient przekazuje klucz osobisty, sesja jest uważana za aktywną. Sesja może kończyć się z różnych powodów, na przykład, ręcznie po stronie serwera lub po ustalonym czasie (limit czasu).

    Z teorii, zwracamy się do praktyki. Programujmy ten algorytm i zobaczmy, jak to jest wykonywane. Aby to zrobić, użyj specjalnej klasy httpsessionstate. Podczas pracy w kontrolerze możesz użyć właściwości httpcontext.session. Praca z sesją jest bardzo prosta, podobnie jak z dowolną Namaluecollection:

    Sesja ["nazwa użytkownika"] \u003d żądanie.form ["nazwa użytkownika"]; Bool IsssionsessionNew \u003d session.isNewSession; String sessionid \u003d session.sessional;

    W tej części kodu piszemy nazwę użytkownika użytkownika do statusu sesji. Podejmujemy tę nazwę z formularza HTML, który nas wysłał. Ponadto poprzez właściwości, dowiadujemy się, czy ta sesja została właśnie stworzona, która jest w ramach bieżącego wniosku (jeśli tak, tak, że wartość właściwości ISNewSession będzie równa prawdziwym), a unikalny identyfikator sesji. Ten identyfikator po przetworzeniu zapytania zostanie automatycznie zarejestrowany w plikach cookie sesji (jeśli jeszcze) i wysłane do odpowiedzi klienta.

    W przeglądarce klienta można obserwować odpowiednie pliki cookie i identyfikator swojej sesji:

    W procesie następnego zapytania z tego klienta przeczytajmy wcześniej zapisaną nazwę z sesji. Również przymusowo zakończona sesja. Praca z tym klientem jest zakończona, na przykład, wszystkie dane są przetwarzane, a produkt jest wysyłany.

    String username \u003d sesja ["nazwa użytkownika"]. Tostring (); // żądanie przetwarzania ... session.abandon ();

    Jak widać, praca z sesjami jest bardzo prosta i wygodna. Większość procesów związanych z przetwarzaniem sesji występuje automatycznie w tle. Oczywiście deweloper może interweniować na dowolnym etapie przetwarzania sesji i dokonać jej korekty.

    Spójrzmy na najciekawsze właściwości i metody klasy httpsessionstate, które są najczęściej używane w pracy:

    Pozycja. - Zwraca element danych na swoim indeksie
    Pozycja. - Zwraca element danych przez jego klucz
    Usuń (indeks) - Usuwa element danych na swoim indeksie
    Usuń (klucz) - Usuwa element danych przez jego klucz
    Jasny () - Usuwa wszystkie dane
    Liczyć - Zwraca całkowitą liczbę elementów danych dla bieżącej sesji.
    Porzucić () - przymusowe uzupełnij sesję
    Sessionid. - Zwraca bieżący identyfikator sesji
    Isnewsession. - zwraca prawdę, jeśli sesja została utworzona jako część bieżącego żądania
    Koniec czasu. - zwraca liczbę minut dozwolonych między żądaniami przed zakończeniem sesji z powodu limitu czasu (domyślnie, 20 minut)

    Możesz zmienić ustawienia dla sesji programowo w kodzie za pomocą członków klasy httpsessionstate lub za pomocą konfiguracji aplikacji (). Na przykład:

    W powyższej konfiguracji wskazaliśmy, że limit czasu sesji będzie wynosić 40 minut, dane sesji użytkownika zostaną przechowywane w losowy pamięć dostępuZostaną użyte pliki cookie sesji, również zmienił standardową nazwę takich plików cookie na własną rękę.

    I jeszcze jedna ważna uwaga bezpieczeństwa. Po zakończeniu sesji użytkownika przez session.abandon (); Identyfikator gotowania sesji sesji, nie jest usuwany w przeglądarce użytkownika. Oznacza to, że jeśli użytkownik rozpocznie nową sesję w najbliższej przyszłości, bez zamykania przeglądarki, jego nowa sesja zostanie przydzielona tym samym sesji. Korzystnie każda nowa sesja zawsze przypisuje nowy unikalny identyfikator, ponieważ musimy ręcznie usunąć pliki cookie sesji po zamknięciu sesji:

    Session.Clear (); // Wyczyść sesję session.abandon (); // anulowaliśmy sesję // ręcznie oczyścić pliki cookie, takie jak rezultat.cookies.add (nowy httpcookie ("ASP.NET_SESSIONID", "")); // lub zmniejsz żywotność odpowiedzi .cookies ["ASP.NET_SESSIONID"]. Wygaskuje \u003d datetime.Now.addyears (-30); //Asp.net_sessionid jest standardową nazwą plików cookie sesji, możesz mieć własny

    W ten sposób śledzenie statusu sesji użytkownika na platformie ASP.NET, przy użyciu sesji. Takie podejście jest standardowe i jest zalecane do użycia, gdy chcesz zapisać informacje o użytkowniku i zidentyfikować go między żądaniami do serwera.

    Pozdrowienia, szanowana społeczność.

    Przede wszystkim chcę podziękować za bardzo przydatny zasób. Więcej niż kiedyś znaleźli wiele ciekawych pomysłów i praktycznych rad.

    Celem tego artykułu jest podkreślenie podwodnych kamieni stosowania sesji w PHP. Oczywiście istnieje dokumentacja na PHP i wiele przykładów, a ten artykuł nie udaje pełny przewodnik. Została zaprojektowana, aby ujawnić niektóre niuanse pracy ze sesjami i chronić deweloperów z niepotrzebnego spędzania czasu.

    Najczęstszym przykładem korzystania z sesji jest oczywiście autoryzacja użytkownika. Zacznijmy od najbardziej podstawowej realizacji, aby konsekwentnie rozwijać ją jako pojawiają się nowe zadania.

    (W celu oszczędzania przestrzeni i czasu, ograniczymy się w przykładach tylko przez funkcje pracy ze sesjami, zamiast budować pełnoprawną aplikację testową tutaj z piękną hierarchią klas, kompleksowe przetwarzanie błędów i innych właściwych rzeczy) .

    Funkcja Uruchomienie () (// Jeśli sesja już uruchomiona, zatrzymaj wykonanie i zwróć True // (parametr session.auto_start w pliku ustawień php.ini musi być wyłączony - wartość domyślna), jeśli (session_id ()) powrót Prawda; inaczej powrót session_start (); // Uwaga: do wersji 5.3.0, funkcja session_start () zwróciła true nawet w przypadku błędu. // jeśli używasz wersji poniżej 5.3.0, wykonaj dodatkową kontrolę session_id ( ) // Po wywołaniu Session_start ()) Funkcja DestroySession () (IF (session_id ()) (// Jeśli jest aktywna sesja, usuń sesję cookies, setcookie (session_name (), session_id (), czas () - 60 * 60 * 24); // i zniszcz sesję session_unset (); session_destroy ();))

    Uwaga: Rozumie się, że podstawowa wiedza na temat sesji PHP na czytelniku ma zatem zasada działania funkcji funkcji session_start () i session_destroy () nie obejmuje tutaj. Zadania formularza układu i formularza uwierzytelniania użytkownika nie odnoszą się do tematu artykułu, więc będziemy je pominąć. Pozwólcie, że przypomnę ci tylko to, aby zidentyfikować użytkownika w każdym kolejnym żądaniu, musimy zostać zapisani w momencie udanego wejścia w zmiennej sesji (z nazwą użytkownika, na przykład) identyfikator użytkownika, który będzie dostępny we wszystkich kolejnych prośby o życie sesji. Konieczne jest również wdrożenie przetwarzania wyniku naszej funkcji startsession (). Jeśli funkcja zwróciła false - aby wyświetlić kształt wejściowy w przeglądarce. Jeśli funkcja zwróciła true, a zmienna sesji zawierająca autoryzowany identyfikator użytkownika (w naszej sprawie - UserIdID), istnieje - aby wyświetlić stronę autoryzowanego użytkownika (dla więcej na temat przetwarzania błędów, zobacz Dodatek od 2013-06-07 w sekcja o zmiennych sesji).

    Chociaż wszystko jest jasne. Pytania rozpoczynają się, gdy jest wymagane do wdrożenia braku aktywności użytkownika (limit czasu sesji), umożliwiają jednoczesną pracę w jednej przeglądarce kilku użytkowników, a także ochrona sesji z nieautoryzowanego użycia. Zostanie to omówione poniżej.

    Kontrola braku aktywności użytkownika z wbudowaną php

    Pierwsze pytanie, które często pojawia się od programistów wszelkiego rodzaju konsol dla użytkowników - automatyczne zakończenie sesji w przypadku braku aktywności od użytkownika. Nie ma nic łatwiejszego niż zrobić, użyj wbudowanych funkcji PHP. (Ta opcja nie różni się szczególnie niezawodnością i elastycznością, ale rozważ go na kompletność obrazu).

    Funkcja Uruchomienie () (// Timeout Brak aktywności użytkownika (w sekundach) $ SessionLifetime \u003d 300; jeśli (session_id ()) powrót True; // Ustaw żywotność pliku cookie ini_set ("session.cookie_lifetime", $ sessionime); // Jeśli limit czasu brak zestawu aktywności użytkownika, ustaw żywotność sesji na serwerze // Uwaga: W przypadku serwera produktu zaleca się zapobiec tym parametrach w php.ini, jeśli ("sessionifetime) ini_set (" session.gc_maxlifetime ", $ sessionifetime); jeśli (session_start ()) (setcookie (session_name (), session_id (), czas () + $ sessionifetime); zwrot prawda;)

    Niektóre wyjaśnienia. Jak wiesz, PHP określa, która jedna sesja trzeba uruchomić, nazwa gotowania, przesyłana przez przeglądarkę w nagłówku żądania. Przeglądarka z kolei odbiera to plik cookie z serwera, w którym miejsca funkcji session_start (). Jeśli wygasła żywotność plików cookie w przeglądarce, nie zostanie przeniesiona w zapytaniu, co oznacza, że \u200b\u200bPHP nie będzie w stanie określić, która sesja powinna zostać uruchomiona i jest spójna jako tworzenie nowej sesji. Parametr ustawienia PHP. session.gc_maxlifetime, który jest ustawiony na nasz czasout braku aktywności użytkownika, ustawia żywotność sesji PHP i jest kontrolowany przez serwer. Działa kontrolę nad życiem sesji w następujący sposób (istnieje przykład przechowywania sesji w plikach tymczasowych jako najczęstszą i domyślną opcję w PHP).

    W momencie utworzenia nowej sesji w katalogu zainstalowanym jako katalog do przechowywania sesji w parametrze ustawień PHP session.Save_path, plik o nazwie sess_ jest tworzony. gdzie - Identyfikator sesji. Ponadto w każdym wniosku w momencie uruchomienia już istniejącej sesji PHP aktualizuje czas modyfikacji tego pliku. Tak więc, w każdym następnym zapytaniu PHP, według różnicy między bieżącym czasem a czasem ostatniej modyfikacji pliku sesji, może określić, czy sesja jest aktywna, czy jej życie już wygasło. (Mechanizm usuwania starych plików sesji jest uważany bardziej szczegółowo w następnej sekcji).

    Uwaga: Należy tutaj zaznaczyć, że parametr session.gc_maxlifetime jest ważny dla wszystkich sesji w jednym serwerze (dokładniej, w ciągu jednego głównego proces PHP.). W praktyce oznacza to, że jeśli na serwerze znajdują się kilka witryn, a każdy z nich ma swój własny limit czasu braku aktywności użytkownika, a następnie zainstalowanie tego parametru na jednej z witryn zostanie zainstalowany i dla innych witryn. To samo dotyczy wspólnego hostingu. Aby uniknąć takiej sytuacji, oddzielne katalogi sesji są używane do każdej witryny w jednym serwerze. Ustawianie ścieżki do katalogu sesji jest wykonany za pomocą parametru session.Save_path w pliku ustawień php.ini lub dzwoniąc do funkcji ini_set (). Po tej sesji każdej witryny będzie przechowywane w oddzielnych katalogach, a parametr session.gc_maxlifetime zainstalowany na jednej z witryn będzie ważny tylko na jego sesji. Nie uwzględnimy tego szczegółowo szczegółowo, zwłaszcza że mamy bardziej elastyczną wersję braku aktywności użytkownika.

    Kontrola braku aktywności użytkownika za pomocą zmiennych sesji

    Wydawało się, że poprzednia opcja z całą jego prostotą (tylko kilka dodatkowych linii kodu) zapewnia wszystko, czego potrzebujemy. Ale co, jeśli nie każda prośba może być traktowana w wyniku aktywności użytkownika? Na przykład na stronie jest ustawiony na stronie, który okresowo wykonuje żądanie AJAX, aby otrzymywać aktualizacje z serwera. Takie żądanie nie można uznać za aktywność użytkownika, co oznacza, że \u200b\u200bautomatyczne rozszerzenie życia sesji nie jest poprawne w tym przypadku. Wiemy jednak, że PHP aktualizuje czas modyfikacji plików sesji automatycznie za każdym razem, gdy funkcja session_start () jest nazywana, co oznacza, że \u200b\u200bkażde żądanie doprowadzi do przedłużenia czasu życia sesji, a brak aktywności użytkownika nigdy nie przyjdzie. Ponadto ostatnia uwaga z poprzedniej sekcji na zawiłości parametru session.gc_maxlifetime może wydawać się komuś zbyt mylącym i złożonym w realizacji.

    Aby rozwiązać ten problem, odmówimy użycia wbudowanego mechanizmy PHP. I przedstawiamy kilka nowych zmiennych sesji, które pozwolą nam kontrolować brak aktywności użytkownika samodzielnie.

    Funkcja Uruchomienie ($ isessionliFetime \u003d true) ($ sessionlifetime \u003d 300; jeśli (session_id ()) powrót True; // Zainstaluj żywotność Cooka przed zamknięciem przeglądarki (będziesz kontrolować wszystko po stronie serwera) ini_set ("session.cookie_lifetime", 0); jeśli (! Session_start ()) zwróć false; $ t \u003d czas (); if ($ sessionime) (// Jeśli brakuje braku aktywności użytkownika, // Sprawdź czas, który minął od ostatniej aktywności użytkownika // (ostatni czas zapytania, gdy zmienna sesji Lastactivity została zaktualizowana), jeśli (Isset ($ _ sesja ["Lastactivity"]) && $ T - $ _ sesja ["Lastactivity"]\u003e \u003d $ sessionifetime) (// Jeśli Czas minął od ostatniej aktywności użytkownika, / / \u200b\u200bwięcej limitu czasu braku aktywności, co oznacza, że \u200b\u200bsesja wygasła i trzeba wypełnić niszczyć (); zwróć false;) inaczej (// jeśli limit czasu nie przyszedł, / / A jeśli zapytanie pojawiło się w wyniku aktywności użytkownika, // aktualizuje zmienną Lastactivity BP BP Emeni, // rozszerzenie czasu sesji jest nadal na sessionsime sekund, jeśli ($ isuseractivity) $ _Session ["Lastactivity"] \u003d $ T; )) Zwróć prawdę; )

    Podsumować. W każdym wniosku sprawdzamy, czy limit czasu zostanie osiągnięty od momentu ostatniej aktywności użytkownika przed obecnym momentem, a jeśli zostanie osiągnięty - niszczymy sesję i przerywa funkcję, zwracając false. Jeśli limit czasu nie zostanie osiągnięty, a parametr $ isuseractivity z wartością true - zaktualizuj czas ostatniej aktywności użytkownika. Wszystko, co musimy zrobić, to określić w skrypcie wywołującego, czy prośba jest wynikiem aktywności użytkownika, a jeśli nie, wywołaj funkcję startsession z wartością parametru $ isuseractivity równy fałszywych.

    Aktualizacja od 2013-06-07.
    Przetwarzanie wyniku funkcji SessionStart ()

    Komentarze nie zwracały uwagi na fakt, że zwrot False nie rozumie w pełni przyczyny błędu i jest absolutnie sprawiedliwe. Nie publikowałem tutaj szczegółowego przetwarzania błędów (zakres artykułu i nie jest mały), ponieważ nie ma zastosowania bezpośrednio na temat artykułu. Ale biorąc pod uwagę komentarze, wyjaśnię.

    Jak widać, funkcja SessionStart może zwrócić fałszywe w dwóch przypadkach. Lub sesja nie mogła zostać uruchomiona z powodu niektórych wewnętrznych błędów serwera (na przykład nieprawidłowe ustawienia sesji w php.ini) lub wygasła żywotność sesji. W pierwszym przypadku musimy przenieść użytkownika na stronę z błędem, że istnieją problemy z serwerem i formą obsługi obsługi. W drugim przypadku musimy przetłumaczyć użytkownika do formularza wejściowego i wprowadzić odpowiednią wiadomość, że czas sesji wygasł. Aby to zrobić, musimy wprowadzić kody błędów i zwrócić odpowiedni kod zamiast false, aw metodzie wywołujące sprawdź go i działać odpowiednio.

    Teraz, nawet jeśli sesja na serwerze nadal istnieje, zostanie zniszczony po pierwszym odwołaniu, jeśli limit czasu braku aktywności użytkownika. I tak się stanie, niezależnie od czasu, gdy sesje są zainstalowane w globalnych ustawieniach PHP.

    Uwaga: Co się stanie, jeśli przeglądarka została zamknięta, a pliki cookie z nazwą sesją zostały automatycznie zniszczone? Wniosek do serwera, następnym razem, gdy otworzysz przeglądarkę, nie będzie zawierał sesji plików cookie, a serwer nie będzie w stanie otworzyć sesji i sprawdzić brak aktywności użytkownika. Dla nas jest odpowiednik tworzenia nowej sesji i nie wpływa na funkcjonalność i bezpieczeństwo. Ale jest to sprawiedliwe pytanie - a kto zniszczy starej sesji, jeśli nadal zniszczymy go po wygaśnięciu Taimaut? A może teraz zawiesić w katalogu sesji na zawsze? Aby oczyścić stare sesje w PHP, istnieje mechanizm zwany kolekcją śmieci. Zaczyna się w czasie następnego żądania do serwera i czyści wszystkie stare sesje na podstawie daty ostatnia zmiana Pliki sesji. Ale początek mechanizmu zbierania śmieci nie występuje w każdym żądaniu na serwerze. Częstotliwość (lub raczej prawdopodobieństwo) startowego jest określona przez dwa parametry session.gc_probowalności i sesji.gc_divisor ustawień. Wynik z podziału pierwszego parametru do drugiego i jest prawdopodobieństwem uruchomienia mechanizmu zbierania śmieci. Tak więc, aby uruchomić mechanizm czyszczenia sesji z każdym żądaniem do dEwarza, parametry te muszą być ustawione na równe wartości, na przykład "1". Podejście to gwarantuje czystość katalogu sesji, ale oczywiście jest zbyt pokryta na serwer. Dlatego w domyślnych systemach produktów, wartość sesji.gc_divisor jest ustawiona, równa 1000, co oznacza, że \u200b\u200bmechanizm zbierania śmieci zostanie uruchomiony z prawdopodobieństwem 1/1000. Jeśli eksperymentujesz z tymi ustawieniami w pliku php.ini, można zauważyć, że w przypadku opisanego powyżej, gdy przeglądarka zamyka się i usuwa wszystkie swoje pliki cookie, w katalogu sesji nadal są nadal stare sesje. Ale nie powinien cię martwić, ponieważ Jak już wspomniano, nie wpływa na bezpieczeństwo naszego mechanizmu.

    Aktualizacja od 2013-06-07.

    Zapobiegaj skryptowi wisi z powodu blokowania plików sesji

    W uwagach podniósł kwestię wiszące jednocześnie uruchomione skrypty z powodu blokowania pliku sesji (jako najjaśniejszą opcję - Długa ankieta).

    Zacząć, pamiętam, że ten problem nie zależy bezpośrednio od obciążenia serwera ani liczby użytkowników. Oczywiście, im więcej żądań, wolniej są wykonywane skrypty. Ale jest to zależność Cosquid. Problem pojawia się tylko w tej samej sesji, gdy serwer zawiera kilka żądań w imieniu jednego użytkownika (na przykład jeden z nich jest długi sondaż, a reszta to normalne żądania). Każde żądanie próbuje uzyskać dostęp do tego samego pliku sesji, a jeśli poprzednie zapytanie nie odblokowano pliku, a następnie następny spędza czas oczekiwania.

    Aby zamknąć pliki sesy, aby zminimalizować, zdecydowanie zaleca się zamknięcie sesji, wywołując funkcję session_Write_close () natychmiast po wykonaniu wszystkich działań z zmiennymi zagranicznymi. W praktyce oznacza to, że nie należy przechowywać w zmiennych sesji z rzędu i skontaktować się z nimi w trakcie wykonania skryptu. A jeśli musisz przechowywać niektóre dane robocze w zmiennych sesji, natychmiast przeczytaj je jednocześnie po uruchomieniu sesji, zapisz w lokalnych zmiennych do późniejszego użycia i zamknięcia sesji (oznacza zamknięcie sesji przy użyciu funkcji session_crite_close, a nie zniszczenia za pomocą session_destroy).

    W naszym przykładzie oznacza to, że natychmiast po otwarciu sesji, sprawdzanie czasu jego życia i istnienia autoryzowanego użytkownika, musimy przeczytać i zapisać wszystkie dodatkowe aplikacje do zmiennych sesji (jeśli są takie), po czym jest Blisko sesji, dzwoniąc do Session_Write_close () i kontynuuj wykonywanie skryptu, niezależnie od tego, czy długi ankiet lub regularne zapytanie.

    Ochrona sesji z nieautoryzowanego użycia

    Wyobraź sobie sytuację. Jednym z twoich użytkowników Klaty Troyan, który okrada bukiet przeglądarki (w którym nasza sesja jest przechowywana) i wysyła go do określonego e-maila. Atakujący dostaje pliki cookie i używa go do fałszywego zapytania w imieniu naszego autoryzowanego użytkownika. Serwer pomyślnie akceptuje i przetwarza ten wniosek, jakby pochodzi z autoryzowanego użytkownika. Jeśli zaimplementowano dodatkowy kontrolny adres IP, taki atak doprowadzi do udanego konta użytkownika hakowania wszystkich następujących konsekwencji.

    Dlaczego to możliwe? Oczywiście, ponieważ nazwa i identyfikator sesji są zawsze takie same w tym samym czasie sesji, a jeśli otrzymasz te dane, możesz łatwo wysyłać żądania w imieniu innego użytkownika (naturalnie, w całym okresie całkowitym tej sesji). Być może nie jest to najczęstszy rodzaj ataków, ale teoretycznie wszystko wygląda dość możliwe, zwłaszcza biorąc pod uwagę, że prawa administratora nie potrzebują nawet takiego trojana, aby obrabować pliki cookie przeglądarki użytkownika.

    Jak mogę chronić przed atakami tego rodzaju? Ponownie, oczywiście, ograniczając żywotność identyfikatora sesji i okresowo zmieniając identyfikator w ramach jednej sesji. Możemy również zmienić nazwę sesji, całkowicie usuwając stare i tworząc nową sesję, kopiując wszystkie zmienne sesji ze starego. Ale nie wpływa na istotę podejścia, dlatego dla prostoty ogranicza się do identyfikatora sesji.

    Oczywiste jest, że mniejsze życie identyfikatora sesji, tym mniej czasu będzie atakujący, aby uzyskać i zastosować pliki cookie dla fałszywych żądań użytkownika. W idealnym przypadku nowy identyfikator musi być używany dla każdego żądania, co pozwoli ci zminimalizować możliwość korzystania z sesji innej osoby. Ale rozważamy ogólny przypadek, gdy czas regeneracji identyfikatora sesji jest ustawiony arbitralnie.

    (Opuść część kodu, który został już uwzględniony).

    Funkcja Uruchomienie ($ isuseraclivity \u003d true) (// Czas trwania identyfikatora sesji $ idlifetime \u003d 60; ... jeśli ($ idlifetime) (// jeśli okres użytkowania identyfikatora sesji jest ustawiony, // Sprawdź czas który minął od sesji lub ostatniej regeneracji sesji // (ostatnim czasem zapytania, gdy zmienna sesja została zaktualizowana), jeśli (Isset ($ _ sesja ["StartTime"])) (IF (IF (IF (If (Session Session [$ T - $ _) "StartTime"]\u003e \u003d $ idlifetime) (// Time Lifestyle Session Identifier // generuj nowy identyfikator session_regenerate_id (true); $ _Session ["startime"] \u003d $ t;)) indziej (// tutaj otrzymujemy, jeśli sesja Właśnie został utworzony // Ustaw czas generowania identyfikatora sesji w bieżącym czasie $ _Session ["startime"] \u003d $ t;)) powrót true;)

    Tak więc, tworząc nową sesję (która występuje w momencie udanego logowania użytkownika), ustawiamy zmienną sesji startime przechowywaną dla nas ostatnią generacją identyfikatora sesji, do wartości równej czasu serwera. Następnie, w każdym wniosku, sprawdzamy, czy wystarczająco dużo czasu (idlifetime) nie minął od ostatniej generacji identyfikatora, a jeśli minęło - generujemy nowy. Tak więc, jeśli atakujący, który otrzymał pliki cookie z autoryzowanego użytkownika, który otrzymał identyfikator identyfikatora identyfikatora, nie ma czasu, aby go użyć, fałszywy wniosek będzie traktowany przez serwer jako nieautoryzowany, a atakujący spadnie na Strona wejścia.

    Uwaga: Nowy identyfikator sesji wchodzi do plików cookie przeglądarki podczas wywoływania funkcji session_regenerate_id () (), która wysyła nowe pliki cookie, podobne do funkcji session_start (), więc nie musimy aktualizować plików cookie samodzielnie.

    Jeśli chcemy zapewnić nasze sesje jak najwięcej, wystarczy ustalić żywotność identyfikatora lub ogólnie znosić funkcję session_regenerate_id () funkcji dla nawiasów i usunąć wszystkie kontrole, co doprowadzi do regeneracji identyfikatora w każdym żądaniu. (Nie sprawdziłem wpływu takiej prędkości, a mogę tylko powiedzieć, że funkcja session_regenerate_id (true) wykonuje zasadniczo 4 kroki: generowanie nowego identyfikatora, tworząc nagłówek z sesją Cook, usuń starej i tworząc nową sesję plik).

    Digresja liryczna: Jeśli Troyans okazuje się być tak mądry, że nie wysyła plików cookie do atakującego, a on organizuje wysyłanie z góry określonego fałszywy wniosku natychmiast po otrzymaniu gotowania, metoda opisana powyżej, najprawdopodobniej nie będzie w stanie chronić przed sobą Atak, ponieważ między czasem odbierania ciasteczek trojańskich i wysyłanie fałszywych zapytania prawie nie będzie różnice, a prawdopodobieństwo jest świetne, że w tym momencie nie otrzyma regeneracji identyfikatora sesji.

    Możliwość jednoczesnego pracuje w jednej przeglądarce w imieniu kilku użytkowników

    Ostatnie zadanie, które chciałbym rozważyć, jest możliwość jednoczesnej pracy w jednej przeglądarce kilku użytkowników. Ta funkcja jest szczególnie przydatna na etapie testowym, gdy trzeba naśladować jednoczesną działalność użytkowników i jest wskazane, aby zrobić to w swojej ulubionej przeglądarce, a nie używać całego dostępnego arsenału lub otwórz kilka instancji przeglądarki w "incognito "Tryb.

    W naszych poprzednich przykładach nie zdefiniowaliśmy nazwy sesji, więc używana jest domyślna nazwa w PHP. Oznacza to, że wszystkie sesje, które zostały stworzone przez nas do tej pory, wysyłają przeglądarkę Cook pod nazwą Phpsesid. Oczywiście, jeśli nazwa gotowania jest zawsze taka sama, nie ma możliwości w jednej przeglądarce, aby zorganizować dwie sesje o tej samej nazwie. Ale jeśli użyliśmy naszej własnej nazwy sesji dla każdego użytkownika, problem zostałby rozwiązany. I zrób to.

    Funkcja Uruchomienie ($ isuseraclivity \u003d true, $ prefiks \u003d null) (... jeśli (session_id ()) zwraca wartość True; // Jeśli parametry przekazują prefiks użytkownika, // Ustaw unikalną nazwę sesji, w tym ten prefiks, // W przeciwnym razie zainstaluj General dla wszystkich nazwy użytkowników (na przykład, myProject) session_name ("myproject". ($ prefiks? "_." $ prefiks: "")) ()) Zwróć false; ...)

    Teraz pozostaje, aby dbać, że skrypt wywoławczy transmisja do funkcji startsession () jest unikalnym prefiksem dla każdego użytkownika. Można to zrobić, na przykład poprzez transfix do parametrów GET / POD każdego żądania lub za pomocą dodatkowych plików cookie.

    Wniosek

    Podsumowując, dam pełny kodeks naszych funkcji do pracy sesje PHP.który obejmuje wszystkie zadania omówione powyżej.

    Funkcja Uruchomienie ($ isuseractivity \u003d true, $ prefiks \u003d null) ($ sessionlifetime \u003d 300; $ idlifetime \u003d 60; jeśli (session_id ()) powrót true; session_name ("myproject". ($ Prefiks? "_". $ Prefiks: "" ")); ini_set (" session.cookie_lifeTime ", 0); jeśli (! session_start ()) zwróć false; $ t \u003d czas (); jeśli ($ sessionime) (jeśli (ISSET ($ _ sesja [" Lastactivity "]) && $ t - $ _ sesja [" lastactivity "]\u003e \u003d $ sessionifetime) (niszczyć (); zwróć false;) inaczej (jeśli ($ isuseractivity) $ _Session [" Lastactivity "] \u003d $ T;)) Jeśli ($ idlifetime) (IF (ISSET ($ _ sesja ["StartTime"])) (IF (IF (If_ Session ["StartTime"]\u003e \u003d $ Idlifetime) (session_regenerate_id (true); $ _Session ["StartTime" ] \u003d $ t;)) * 60 * 24); session_destroy ();))

    Mam nadzieję, że ten artykuł uratuje trochę czasu dla tych, którzy nigdy nie pogłębiali się w mechanizmie sesji, i da wystarczająco dużo zrozumienia tego mechanizmu tym, którzy dopiero zaczynają się zapoznać się z PHP.

    W module. Aktywny Cessia. W dowolnym momencie można zobaczyć listę użytkowników pracujących z panelem sterującym w dowolnym momencie. ten momentAdres IP, z którego uzyskuje dostęp do użytkownika, a czas minął od momentu otrzymania ostatniego polecenia od tego użytkownika.

    W razie potrzeby możesz wypełnić sesję wybranego użytkownika.

    Moduł "Sesje aktywne"

    Wyświetl informacje o aktualnych połączeniach

    • Identyfikator sesji. - Unikalny numer identyfikujący sesję z panelu sterowania. Domyślnie informacje są wyświetlane w tabeli przez 60 minut.
    • Użytkownik - Nazwa użytkownika podłączona do systemu jest obecnie.
    • Dostęp - Dostęp do poziomu tego użytkownika do panelu sterowania (na przykład superużytkownika, administratora serwera, użytkownika itp.).
    • adres IP - zdalny adres IP, z którego dostępny jest dostęp.
    • Oczekiwanie - Czas minął od momentu, gdy panel sterowania otrzymał ostatnie polecenie od użytkownika.
    • Aktywne żądania - Liczba aktywnych żądań.

    Zakończenie sesji

    Aby wykonać tę lub tę sesję za pomocą panelu sterowania, zaznacz wymagane wiersze na liście aktywnych sesji i kliknij przycisk Zakończ.

    Aby zapobiec przypadkowemu usuwaniu, panel sterowania poprosi o potwierdzenie lub anulowanie działania. Jeśli klikniesz "OK" w oknie potwierdzenia, wybrane sesje zostaną zakończone.

    Jeśli sesja została zakończona, aby uzyskać dalsze prace z panelem sterowania, użytkownik musi się ponownie zalogować.

    Ten formularz nie jest odwołaniem do wsparcia.
    Nie możemy cię zidentyfikować i odpowiedzieć na wiadomość.

    Sesja (z lat. - Sessio - spotkanie, angielsko - sesja) - jest to okres zakrywania użytkownika w Internecie od momentu otwarcia pierwszego i do ostatnich linków. Jest obliczany jako różnica czasu między początkowymi i końcowymi wnioskami. Jednak ostatnia strona może być oglądana przez użytkownika w różnych czasach, z których dlatego pomiar czasu między dwoma żądaniami staje się trudniejsze.

    Jaka jest sesja z protokołem HTTP i Cookies

    Co taka sesja można wyjaśnić, wypychając z protokołu HTTP. Sam protokół ten nie ma sposobu na zachowanie stanu między dwiema operacjach. Te. I tutaj pomoc specjalnej metody śledzenia przychodzi do pomocy - kontrola sesji (przez nasze sesje).
    Stąd odpowiadając na pytanie, jakiego sesji możemy powiedzieć, że jest to pomocniczy obiekt logiczny, który promuje transmisję danych między sekwencyjnymi żądaniami HTTP z jednego użytkownika.
    Pliki cookie, jak sesja, przechowywać informacje o użytkowniku podczas ruchu na różnych stronach i poprawić działanie protokołu. Ale w przeciwieństwie do drugiego, gdzie dane są przechowywane w tymczasowych plikach na serwerze, przechowują je na komputerze użytkownika w formie małych fragmentów.

    Za jakie są potrzebne sesje

    Korzystanie z sesji staje się niezbędne podczas pracy z takimi witrynami, jak fora, tablice ogłoszeń i sklepów internetowych, ponieważ w tym przypadku należy zapisać dane użytkownika dla kilku stron.

    Etapy sesji

    Wszystkie sesja można podzielić na trzy etapy:

    • sesja otwarcia (gdy użytkownik rozpoczyna pracę z określoną witryną),
    • księgowość dla sesji zmiennych (poruszając się na różne strony),
    • zakończenie sesji.

    Ze względu na fakt, że sesje te są przechowywane na serwerze trzeciej, najlepiej, aby nie zachować dużych ilości informacji w nich, ale używać plików cookie.