Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu

Technologia sesji B. PHP.prosta droga Przechowywanie informacji dla użytkownika jednego użytkownika. Na przykład: towary dodane do koszyka zakupów, ustawienia powiadomienia itp. Gdy strona jest po raz pierwszy żądana do serwera, przeglądarka jest zapisywana w unikalnych plików cookie identyfikator sesji. Użytkownik. Następnie identyfikator lub wiązka identyfikatora z adresem IP identyfikuje użytkownika. Można go użyć do zapisania statusu żądań stron. Identyfikatory sesji są zazwyczaj wysyłane do przeglądarki poprzez plik cookie sesji i służą do uzyskania dostępnych danych sesji.

Sesje są używane prosta technologia: PHP otrzyma dane dotyczące istniejącej sesji przy użyciu przesyłanego identyfikatora (zwykle z sesji ciastko) Lub, jeśli nic nie zostało przekazane, zostanie utworzona nowa sesja. PHP wypełnia zmienną Superglobal $ _SESSION przez informacje o sesji po uruchomieniu sesji. Po zakończeniu PHP automatycznie serializuje zawartość zmiennej Superglobal $ _Session i wysyła, aby zapisać za pomocą programu obsługi sesji, aby nagrać sesję.

Domyślnie PHP używa wewnętrznego przewodnika akta. Aby zapisać sesje, które jest zainstalowane w Session.Save_Handler INI zmiennej. Ten przewodnik oszczędza dane na serwerze w katalogu określonym w dyrektywie konfiguracyjnej session.Save_path.

Najprostszym przykładem korzystania z sesji, na przykład, wyjście numerów kontaktów do strony dla każdego użytkownika:

Jak można możliwe sesje

Na stronie PHP w sekcjach Opis sesji jest notatka (http://php.net/manual/ru/session.examples.basic.php):

Sesje za pomocą plików (domyślnie w PHP.), Natychmiast zablokuj plik sesji, gdy sesja otwiera funkcję session_start () lub pośrednio przy określaniu sesji.Auto_start. Po zablokowaniu, żaden inny skrypt nie może uzyskać dostępu do tego samego pliku sesji, dopóki nie zostanie zamknięty lub gdy skrypt zostanie zakończony lub gdy wywołana jest funkcja session_write_close ().

Najprawdopodobniej będzie problemem dla witryn, które aktywnie używać Ajax. I wykonaj kilka jednoczesnych wniosków. Najprostszym sposobem na rozwiązanie tego problemu będzie połączenie funkcji session_Wite_close () natychmiast, gdy tylko wszystkie wymagane zmiany w sesji są wykonane, najlepiej bliższe do początku skryptu. Możesz także użyć innego mechanizmu sesji, który obsługuje konkurencyjny dostęp.

Ostatnio problem blokujący sesje staje się coraz częstszy. Jest to częściowo ze względu na komplikację witryn i potrzeba wytwarzania większej liczby obliczeń na serwerze silniejszym, a także z wielką dystrybucją Ajax.. Niestety, logika aplikacji nie zawsze jest, zwłaszcza jeśli jest skomplikowana, pozwala skutecznie ograniczyć czas blokowania konkurencyjnych procesów. Sytuacja jest obciążona faktem, że 3-5 takich klientów są w stanie szybko wygrać wisiała i bezczynność w oczekiwaniu na procesy PHP-Workche, co skutkuje witryną rozpocznie się wydawanie Błąd 5xx. .

Najprostszym przykładem sesji blokujących:

// tylko dla jednego skryptu ?>

Jeśli najpierw otworzysz ten plik na pierwszej karcie, a następnie w drugiej - Druga karta będzie czekać, aż pierwszy włącza się do pierwszego. Oznacza to, że druga karta będzie czekać, aż pierwszy nie zwolni plik sesji (który zajmuje w określonym przypadku 30 sekund). Ten problem dobrze opisane na blogu firmy 1c-bitrix. Na HabrahaBr.

Jakie opcje rozwiązywania tego problemu istnieją

Możesz użyć bazy danych do przechowywania sesji MySQL. lub PostgreSQL. (co nie jest dobre, biorąc pod uwagę możliwości większości baz danych i możliwą prędkość pracy to zadanie), Memcached. (nie gwarantuje pamięci sesji, można go usunąć) i Redisrozważamy optymalna pamięć masowa. Z prędkością nie jest gorsza od memcached, ale może zagwarantować bezpieczeństwo danych.

I najważniejsza zaleta Redis - Po zapisaniu w nim sesje nie są zablokowane.

W naszym panelu sterowania () można włączyć sesje pamięci masowej w Redis dla wszystkich witryn na koncie. Aby to zrobić, przejdź do sekcji " Witryny", a potem świętuj kleszczkę -" Przechowuj sesje wszystkich witryn w Redis".

Dodatkowe materiały

Sekcje

Ssh.

Ftp.

Aplikacje internetowe

  • Informacje o instalacji aplikacji Ogólne (Docker Virtual Environment)

Diagnoza problemów

Domeny

  • Anulowanie nazwy domeny w strefie.ru / .rf, dla którego spodni jest rejestrator
  • Przeniesienie nazw domen Administration Rights.ru / .RF / strefy międzynarodowe (zmiana domeny administratora)

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 ustawień 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 zauważyć, że parametr session.gc_maxlifetime jest ważny dla wszystkich sesji w jednym serwerze (dokładniej, w ciągu jednego głównego procesu 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 wbudowanych mechanizmów PHP i wprowadzimy 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ętrzne błędy Serwery (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 nie jest zaimplementowany dodatkowa weryfikacja Adresy IP, taki atak doprowadzi do udanego hakowego konta użytkownika we wszystkich kolejnych 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;)) else ($ _Session ["StartTime"] \u003d $ t;)) Zwróć prawdziwe;) Funkcja DestroySession () (If_unset (); SetCookie (Session_Name (), Session_id (), Czas () -60 * 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 tym artykule dodamy do naszej rejestracji czekmI.- pocztaadresy, automatyczne logowanie i przywrócenie zapomniałeś hasła . Przed kontynuowaniem lekcji upewnij się, że masz funkcję na serwerze poczta ().

Zacznij od dodawania pól do tabeli « użytkownicy.» . Potrzebujemy pola do przechowywania adresu e-mail, pole dla statusu użytkownika (0 - nieaktywne, 1 - aktywowane) i pole z datą rejestracji.





Następnie należy poprawić save_user.php.Dodając weryfikację poprawności adresu e-mail i wysyłanie listu, aby potwierdzić rejestrację. List zawiera link z dwiema zmiennymi transmitowanymi przez metodę GET : Zaloguj się i wygenerowane, unikalne dla każdego użytkownika, kodu. Kode, którego potrzebujemy, aby użytkownik nie mógł aktywować jego konta bez listu, a to da nam pewność, że wprowadzony adres post jest naprawdę należący do niego. Dodaj następujący kod po wyodrębnianiu danych z zmiennych globalnych:

Jeśli (ISSET ($ _ Post ["Email"])) ($ Email \u003d $ _Post ["Email"]; jeśli ($ e-mail \u003d\u003d "") (Unset ($ e-mail);)))))))))))))))
Jeśli (pusty ($ login) lub pusty ($ hasło) lub pusty ($ kodu) lub pusty ($ e-mail))
// Dodaj zmienną zmI.- pocztaadres
// Jeśli użytkownik nie wprowadził loginu lub hasła, podajemy błąd i zatrzymamy skrypt
{
Wyjdź ("Wprowadziłeś nie wszystkie informacje, wróć i wypełnij wszystkie pola!"); // Rozpocznij wykonanie scenariuszy
}
Jeśli (! preg_match ("/ [Chroniony e-mail]+. (2.3) / I ", $ e-mail)) // Sprawdź adresy e-mail wyrażenia regularne Poprawność
(Wyjście ("E-mail jest nieprawidłowy!");)

Wniosek o dodanie nowego użytkownika musi zostać rozwiązany, a data rejestracji. Jeśli dane zostaną pomyślnie wstawiane do bazy danych, a użytkownik jest zarejestrowany, musisz wysłać wiadomość na adres:

// jeśli nie, zapisujemy dane
$ Dostawca2 \u003d MySQL_QUERY ("Wstaw użytkowników (login, hasło, awatar, e-mail, daty) wartości (" $ Login "," $ Hasło "," Avatar "," $ e-mail ", teraz ())") ;
// Sprawdź, czy są błędy
If ($ Rest2 \u003d\u003d "Prawda")
{
$ Dostawca3 \u003d MySQL_Query ("Wybierz ID od użytkowników, w których logowanie \u003d" $ Login "", $ DB); // Usuń identyfikator użytkownika. Dzięki nim będziemy unikalny kod Aktywacja, ponieważ nie mogą być dwie identyczne identyfikatory.
$ Myrow3 \u003d mysql_fetch_array ($ wynik 3);
$ Aktywacja \u003d MD5 ($ Myrow3 ["ID"]). MD5 ($ Login); // kodaktywacjakonto. Wprowadź identyfikator funkcji MD5 i login. Taka kombinacja użytkownika jest mało prawdopodobna, aby ręcznie uczynić go ręcznym przez pasek adresu.
$ Temat \u003d "Potwierdzenie rejestracji"; //Temat wiadomości
$ Message \u003d "Witaj! Dzięki za rejestrację na CitoneMe.ru NVAS Login:". $ Login. "N
Postępuj zgodnie z linkiem, aby aktywować swoje konto: NHTTP: //Localhost/test3/aktyway.php? Login \u003d ". $ Login." & Code \u003d ". $ Aktywacja." Szacunek NC, N
Administracja Citekse.ru; // Spis treści Wysłany
Poczta ($ e-mail, $ Temat, $ Message, "Typ treści: tekst / płaszczyzna; Charset \u003d Windows-1251 r n"); // Wysłać wiadomość

Echo "Jesteś wysłany do listu e-mail z odosobnieniem, aby potwierdzić rejestrację. Uwaga! Link jest ważny przez 1 godzinę. Strona główna"; // mówimy o liście wysłanym przez użytkownika
}

Wiadomość wysłana! Teraz użytkownik otworzy go i przejdź do wskazanego linku do strony, która sprawdzi kod aktywacyjny. Upewnienie się, że kod jest wierny, potwierdzamy rejestrację, zmieniając wartość pola w bazie danych aktywacja. Z "0" do "1".

Utwórz plik. aktywacja.php.

Obejmują ("bd.php"); // plik.bd.. pHP. musi być w tym samym folderze, co wszyscy, jeśli nie, po prostu zmień drogę
$ Dostawca4 \u003d MySQL_Query ("Wybierz Avatar od użytkowników, w których aktywacja \u003d" 0 "i UNIX_TIMESTAMP () - UNIX_TIMESTAMP (data)\u003e 3600); // Usuń awatary tych użytkowników, którzy nie aktywowali ich konta w ciągu godziny. Dlatego muszą zostać usunięte z podstawy, a także plików ich awatarów
Jeśli (MySQL_NUM_Rows ($ Rests4)\u003e 0) (
$ Myrow4 \u003d mysql_fetch_array ($ wyniku4);
zrobić.
{
// Usuń awatary w cyklu, jeśli nie są standardowe
Jeśli ($ Myrow4 ["Avatar"] \u003d\u003d "awatary / net-avatara.jpg") ($ a \u003d "nie rób nic";)
Inaczej (
UNLINK ($ Myrow4 ["Avatar"]); // Usuń plik
}
}
Podczas gdy ($ myrow4 \u003d mysql_fetch_array ($ wynikowy4));
}
MySQL_QUERY ("Usuń od użytkowników, w których aktywacja \u003d" 0 "i UNIX_TIMESTAMP () - UNIX_TIMESTAMP (data)\u003e 3600); // Usuń użytkowników z podstawy
Jeśli (ISSET ($ _ Pobierz ["Kod"])) ($ Code \u003d $ _ Get [Code "];) //kod potwierdzający
JESZCZE.
(Wyjdź ("Poszedłeś na stronę bez kodu potwierdzającego!");) // jeśli nie określonokod., a następnie wydasz błąd
Jeśli (Isset ($ _ Get ["Login"])) ($ Login \u003d $ _ Get ["Login"];) // logowanie do aktywacji
JESZCZE.
(Wyjdź ("Poszedłeś na stronę bez logowania!");) // Jeśli nie określisz loginu, podajemy błąd
$ Dess \u003d MySQL_Query ("Wybierz ID od użytkowników, w których logowanie \u003d" $ Login "", $ DB); // Usuń identyfikator użytkownika za pomocą tego logowania
$ Aktywacja \u003d Md5 ($ Myrow [ID "]). MD5 ($ Login); // Utwórz ten sam kod potwierdzenia
Jeśli ($ aktywacja \u003d\u003d $ Code) ( // porównuj wynikuRL. i wygenerowany kod
MySQL_QUERY ("Aktualizuj USTAWY USTAWY Aktywacja \u003d" 1 "Gdzie logowanie \u003d" $ Login "", $ DB); // jeśli jesteś równy, aktywuj użytkownika
Echo "Twoja wiadomość e-mail jest potwierdzona! Teraz możesz przejść do witryny pod logowaniem! Strona główna";
}
Else (echo "błąd! Twój e-mail nie jest potwierdzony! Home";
// jeśli wynikuRL. a wygenerowany kod nie jest równy, dajemy błąd
}
?>

Adres e-mail został potwierdzony, teraz wiemy, że ten adres jest własnością ten użytkownik.Możesz wysłać hasło do niego, jeśli użytkownik zapomni o tym lub innych powiadomień. Ale jaka jest różnica między aktywnymi użytkownikami, od nieaktywnianych? A te, a inni mogą udać się do witryny, musimy zatem ograniczyć dostęp do nieaktywnych. Otwórz plik testreg.. pHP. I dodaj jeszcze jeden warunek w zapytaniu do bazy danych:

$ Dess Dess \u003d MySQL_Query ("Wybierz * od użytkowników, w których logowanie \u003d" $ Login "i hasło \u003d" $ hasło "i aktywne \u003d" 1 "", $ DB); // Usuń wszystkie dane o użytkowniku z logowania z bazy danych.
// ukończyliśmy "I.aktywacja.\u003d "1", to znaczy użytkownik zostanie wyszukiwany tylko wśród aktywowanych. Wskazane jest dodanie tego warunku do innych podobnych kontroli danych użytkownika.

Jeśli użytkownik zapomni hasła, w takim przypadku musisz wycofać link do strona głównaDla których może go przywrócić, a także natychmiast umieścić pole wyboru, aby automatycznie login.

Automatyczne wejście.






Zarejestrować


Zapomniałeś hasła?

Jest link, ale nie ma pliku. Napiszmy wysłać._ przechodzić. pHP.. W nim poprosimy login użytkownika i adres e-mail. Jeśli wprowadzony e-mail i login znajduje się w bazie danych, wyślemy go do niego nowe hasłoJeśli użytkownik zapomniał o starym, ponieważ byliśmy przekonani podczas rejestracji, że adres e-mail jest ważny.

Jeśli (ISET ($ _ Post ["Login"])) ($ Login \u003d $ _POST ["Login"]; jeśli ($ Login \u003d\u003d "") (Unset ($ Login);)) // Wprowadzamy użytkownika wprowadzonego przez użytkownika w zmiennej $ Login, jeśli jest pusty, a następnie niszczymy zmienną
Jeśli (ISSET ($ _ Post ["Email"])) ($ Email \u003d $ _Post ["Email"]; jeśli ($ e-mail \u003d\u003d "") (Unset ($ e-mail);))))))))))))))) // weszliśmy do użytkownika e-mail wprowadzony przez użytkownika, jeśli jest pusty, a następnie niszczymy zmienną
Jeśli (Isset ($ Login) i Isset ($ Eail)) ( // jeśli są konieczne zmienne

Obejmują ("bd.php");

$ Dess \u003d MySQL_Query ("Wybierz ID od użytkowników, w którym logowanie \u003d" $ Login "i e-mail \u003d" $ e-mail "i aktywny \u003d" 1 "", $ DB); // takikłamstwow.użytkownikmI.- męski
$ myROW \u003d MySQL_Fetch_array ($ wynik);
Jeśli (pusty ($ Myrow ["ID]) lub Myrow $ [ID"] \u003d\u003d "") (
// Jeśli nie ma aktywowanego użytkownika z takim loginem i adresem e-mail
Wyjdź ("Użytkownik z taki adres e-mail nie został wykryty w dowolnej bazie danych CIA :) Strona główna");
}
// Jeśli użytkownik zostanie znaleziony z takim loginem i e-mailem, konieczne jest wygenerowanie losowego hasła, odśwież je w bazie danych i wyślij do wiadomości e-mail
$ DATENOW \u003d Data ("YMDHIS"); // Usuń datę
$ new_password \u003d MD5 ($ Datenow); // szyfruj datę
$ new_password \u003d substr ($ new_password, 2, 6); // Usuń 6 znaków z szyfru od drugiego. Będzie to nasze losowe hasło. Następnie piszemy go do bazy danych, szyfrowania tak samo jak zwykle.

$ new_password_sh \u003d strev (MD5 ($ new_password)). "B3P6F"; // zaszyfrowany
MySQL_QUERY ("UPDATE USTAWY USTAWY SET Password \u003d" $ new_password_sh "Gdzie login \u003d" $ Login "", $ DB); // zaktualizowanywbaza
// tworząc wiadomość

$ Message \u003d "Hello," $ Login. "! Wygenerowaliśmy dla Ciebie hasła, teraz możesz wprowadzić stronę CitName.ru, używając go. Po wejściu jest pożądane, aby go zmienić. Hasło: N." $ new_password; //Wiadomość tekstowa
Poczta ($ e-mail, "odzyskiwanie hasła", $ Message, "Typ treści: tekst / płaszczyzna; Charset \u003d Windows-1251 r n"); // wysłaćwiadomość

Echo " Twój e-mail wysłał list z hasłem. Zostaniesz przeniesiony po 5 sekundach. Jeśli nie chcesz czekać, kliknij tutaj. "; // przekieruj użytkownika
}
Inaczej ( // jeśli dane nie zostały jeszcze wprowadzone
Echo "


Zapomniałeś hasła?


Zapomniałeś hasła?



Wpisz swój login:



Wprowadź swój email:






";
}
?>

Następnie zrobimy automatyczne wejście. Będzie to działać: z dobrym wejściem z prasowanym pola wyboru w pliku cookie, Auto \u003d "Tak" będzie pasować. Jeśli serwer widzi, że w przeglądarce AUTO \u003d "Tak", rozpocznie sesję, a zmienne zajmie to samo, w pliku cookie. Następnie istnieje test uruchomienia sesji bazy danych.

otwarty testreg.. pHP. I dodaj kod po udanym wejściu:

Jeśli (Isset ($ _ Post ["Zapisz"])) (
// Jeśli użytkownik chce, aby jego dane były zachowane na kolejne wejście, trzymamy w plikach cookie z jego przeglądarki

Setcookie ("ID", $ Myrow ["ID"], czas () + 9999999);)
jeśli (Isset ($ _ Post ["Autovhod"])) (
// Jeśli użytkownik chce automatycznie wprowadzić witrynę
Setcookie ("auto", "tak", czas () + 9999999);
Setcookie ("login", $ _post ["login"], czas () + 9999999);
setcookie ("hasło", $ _post ["hasło"], czas () + 9999999);
Setcookie ("ID", $ Myrow ["ID"], czas () + 9999999);)

Teraz musisz rozpocząć sesję we właściwym miejscu, jeśli masz automatyczne wejście. otwarty index.php. I napisz na samym początku strony:

// Cała procedura działa na sesjach. Jest w tym, że dane użytkownika są przechowywane, gdy jest na miejscu. Bardzo ważne jest uruchomienie ich na samym początku strony !!!
session_start ();
Obejmują ("bd.php"); // plik bd.php powinien znajdować się w tym samym folderze, co wszyscy, jeśli nie, po prostu zmień drogę
Jeśli (Isset ($ _ Cookie ["Auto"]) i Isset ($ _ Cookie ["Login"]) i Isset ($ _ Cookie ["Hasło"])))))
{// jeśli to konieczne zmienne
Jeśli ($ _cookie ["auto"] \u003d\u003d "tak") ( // Jeśli użytkownik chce wprowadzić automatycznie, uruchom sesję
$ _SESSION ["Hasło"] \u003d Strev (MD5 ($ _ Cookie ["Hasło"])). "B3P6F"; // w plikach cookie hasło nie zostało zaszyfrowane, aw sesjach zwykle przechowywane są szyfrowane
$ _Session ["login"] \u003d $ _ Cookie ["Login"]; // sesjazzaloguj sie
$ _SESSION ["ID"] \u003d $ _ Cookie ["ID"]; //identyfikator użytkownika
}
}

Teraz nawet nie pomożemy wyjściowi, aby zmienić użytkownika! W wYJŚCIE.. pHP. Sesje są usuwane, które są nadal tworzone indeks. pHP.Dzięki cookies, które są przechowywane przez bardzo długi czas! Uzyskajmy plik wYJŚCIE.. pHP.A następnie nie jest funkcjonalny w przypadku automatycznego logowania. Musimy po prostu usunąć automatyczne wejście plików cookie po usunięciu zmiennych z sesji:

Setcookie ("auto", "", czas () + 9999999); // Wyczyść automatyczne wejście

Musisz także dodać do aktualizacja._ użytkownik.. pHP. Po zaktualizowaniu logowania w sesji:

$ _SESSION ["Login"] \u003d $ Login; // Zaktualizuj logowanie do sesji
Jeśli (Isset ($ _ Cookie ["Login"])) (
Setcookie ("login", $ Login, Time () + 9999999); // Aktualizacjazaloguj siewkucharze.
}

I to samo z hasłem

$ RESSEL4 \u003d MySQL_QUERY ("UPDATE USTAWY USTAWY USTAWE HASŁO \u003d" $ HASŁO "Gdzie Login \u003d" $ old_login "", $ dB); // aktualizacjahasło
If ($ Dests4 \u003d\u003d "Prawda") ( // jeśli prawda, a następnie zaktualizuj go w sesji
$ _SESSION ["Hasło"] \u003d $ Hasło;
Jeśli (Isset ($ _ Cookie ["Hasło"])) (
Setcookie ("Hasło", $ _ Post ["Hasło"], czas () + 9999999); // Aktualizacjahasłowkucharze., jeślioni sąjest
}

Otóż \u200b\u200bto. Mam nadzieję, że odniesiesz sukces! Powodzenia!

Dobrych przyjaciół! Spójrzmy na rejestrację użytkowników na PHP. Aby rozpocząć, określmy warunki naszej rejestracji użytkownika:

  • Hasło szyfrowane z algorytmem MD5.
  • Hasło "Soline"
  • Zameldowanie zatrudnienia logowania
  • Aktywuj list użytkownika.
  • Nagrywanie i przechowywanie danych Dbms mysql.

Aby napisać ten skrypt, musimy zrozumieć, jaki użytkownik jest zarejestrowany. Rejestracja użytkownika jest uzyskanie prawdziwych danych użytkownika, przetwarzania i przechowywania danych.

Jeśli wyjaśnisz z prostymi słowami, zameldowanie to tylko rekord i przechowywanie pewnych danych, na których możemy autoryzować użytkownika w naszym przypadku - jest to login i hasło.

Upoważnienie - zapewnienie określonej osoby lub grupy osób do wykonywania pewnych działań, a także proces weryfikacji tych praw, próbując wypełnić te działania. Podobnie, przy użyciu autoryzacji, możemy odróżnić dostęp do jednej lub innej treści na naszej stronie internetowej.

Rozważ strukturę katalogów skryptów w celu wdrożenia naszej rejestracji z autoryzacją. Musimy złamać skrypty na elementach logicznych. Moduły rejestracji i autoryzacji posiadamy oddzielny katalog. Również w oddzielnych katalogach umieścimy połączenie bazy danych MySQL., plik z funkcjami użytkownika, plik stylu CSS. I nasz szablon Html.. Ta struktura pozwala szybko poruszać się po skryptach. Wyobraź sobie, że masz dużą stronę z grupą modułów itp. A jeśli nie ma zamówienia, bardzo trudno jest znaleźć coś w takim bałaganie.

Ponieważ przechowujemy wszystkie dane Dbms mysql.Utwórzmy nie duży stół, w którym przechowujemy dane rejestracyjne.

Najpierw musisz utworzyć tabelę w bazie danych. Nazwa tabeli bez_regu. Gdzie bez. - jest to prefiks stołu i reg. Nazwa tabeli.

Struktura tabeli: bez_regu.

- - Struktura "Tabeli BEZ_REG" - Utwórz tabelę, jeśli nie istnieje` bez_regu` (ID` Int (11) Nie zerowy auto_increment, `Login` Varchar (200) Nie Null,` Pass` Varchar (32) Nie Null, `Salt` Varchar (32) Nie Null,` Active_Hex`

Teraz tworzą podstawowe skrypty do dalszej pracy.

Index.php.

Plik config.php.

"); ?>

Plik 404.html.

błąd 404

błąd 404

Strona nastąpiła 404

Powrót

Plik bd.php.

Plik index.html.

Rejestracja użytkowników PHP MySQL z aktywacją pisania

Funkcja pliku.php.

"." N "; jeśli (is_array ($ Data)) (Foreach ($ Data jako $ Val) $ Err. \u003d"

  • . "$ Val."
  • "." N ";) inaczej $ Err. \u003d"
  • "$ Dane".
  • "." N "; $ Err. \u003d""." N "; Powrót $ Err;) / ** Prosty Owijarka do zapytań do MySQL * @param String $ SQL * / Funkcja MySQLQUERY ($ SQL) ($ RES \u003d MySQL_QUERY ($ SQL); / * Sprawdź wynik . Pokazuje prawdziwy wniosek wysłany do MySQL, a także błąd. Wygodny podczas debugowania. * / If (! $ RES) ($ Message \u003d "Nieprawidłowe zapytanie:". MySQL_Error (). "N" "Całkowicie:". $ SQL; Die ($ Message);) Zwróć $ RES;) / ** Prosty generator soli * @param String $ SQL * / Funkcja Sól () ($ Salt \u003d Substr (MD5 (Uniqid ()) , - 8); zwróć $ sól;)

    Zacznijmy pisać rejestrację. Aby rozpocząć, musimy dokonać szablonu formularza rejestracyjnego, aby użytkownik mógł dokonać swoich danych do przetwarzania. Następnie będziemy musieli napisać samą obsługę formularza, który sprawdzi poprawność wprowadzonych danych użytkownika. Po pomyślnym zweryfikowaniu danych przez zapisanie ich do naszej bazy danych i wysłać list do użytkownika, aby aktywować swoje konto.

    Plik reg.php.

    Zarejestrowałeś się pomyślnie! Proszę aktywować konto !!"; // Produkujemy aktywację konta IF (ISSET ($ _ Pobierz [" Klucz "])) (// Sprawdź klawisz $ SQL \u003d" Wybierz * z `". Bez_dbprefix. "Reg`, gdzie" Active_str " . Escape_str ($ _get ["Klucz"]). "" "; $ Res \u003d mysqlquery ($ sql); jeśli (mysql_num_Rows ($ res) \u003d\u003d 0) $ err \u003d" Klucz aktywacyjny nie jest prawdą! " / Sprawdź obecność błędów i wyświetlamy, jeśli użytkownik (liczba ($ Err)\u003e 0) Echo ShotRorMessage ($ Err), inaczej (// otrzymujemy adres użytkownika $ Row \u003d mysql_fetch_assoc ($ res); $ e-mail \u003d $ rzędu ["Logowanie"]; // Aktywuj użytkownika konta $ SQL \u003d "Update`". Bez_dbprefix. "Reg` Set` Status` \u003d 1, gdzie "Login`". " \u003d mysqlquery ($ sql); // Wyślij list, aby aktywować $ tytuł \u003d "(! Lang: Twoje konto na http: // Strona pomyślnie aktywowana"; $message = "Поздравляю Вас, Ваш аккаунт на http://сайт успешно активирован"; sendMessageMail($email, BEZ_MAIL_AUTOR, $title, $message); /*Перенаправляем пользователя на нужную нам страницу*/ header("Location:". BEZ_HOST ."less/reg/?mode=reg&active=ok"); exit; } } /*Если нажата кнопка на регистрацию, начинаем проверку*/ if(isset($_POST["submit"])) { //Утюжим пришедшие данные if(empty($_POST["email"])) $err = "Поле Email не может быть пустым!"; else { if(!preg_match("/^!} [Chroniony e-mail](+.) + (2.6) $ / i ", $ _POST [" Email "])) $ Err \u003d" E-mail "nie jest poprawnie wprowadzony." N ";), jeśli (pusty ($ _ post [" Pass "]) $ err \u003d" Pole hasła nie może być puste "; jeśli (pusty ($ _ Post [" Pass2]) $ err \u003d "Pole potwierdzenia hasła nie może być puste"; // Sprawdź obecność błędów i Wyświetlamy użytkownika, jeśli jest Użytkownik (Count ($ Err)\u003e 0) Echo ShotRorMessage ($ Err), inaczej (/ * nadal sprawdzamy wprowadzone dane Sprawdź hasła: / If ($ _ Post ["Pass"]! \u003d $ _ _POST ["Pass2"]) $ err \u003d "Hasła nie kłócą się"; // Sprawdź obecność błędów i wyświetlić użytkownik, jeśli (liczba ($ Err)\u003e 0) Echo Widokowa ($ Err); inaczej (/ * sprawdzanie); inaczej (/ * sprawdzanie) Jeśli mamy taki użytkownik w bazie danych / $ SQL \u003d "Wybierz" Login` od `". Bez_dbprefix. "Reg` gdzie` Login` \u003d" ". Escape_str ($ _ Post [" Email "]." $ res \u003d mysqlquery ($ sql); jeśli (mysql_num_Rows ($ res)\u003e 0) $ err \u003d "Niestety logowanie: . "$ _POST [" Email "]." Zajęty! "; // Sprawdź obecność błędów i wyświetlanie użytkownika, jeśli (liczba ($ Err)\u003e 0) Echo WidokowaRormiczny ($ Err); inaczej (// Uzyskaj wysoką sól $ sól \u003d sól (); // hasło soli $ Pass \u003d MD5 (MD5 ($ _ Post ["Pass"]). $ Salt); / * Jeśli wszystko jest dobre, zapisanie danych do bazy danych * / $ SQL \u003d "Wstaw do". bez_dbprefix. "Wartości reg` ("", ". Escape_str ($ _ Post [" Email "])." ",". "$ Pass." ",". "$ Sól." ",". MD5 ($ sól) . "", 0) "; $ res \u003d mysqlquery ($ sql); // Wyślij list, aby aktywować $ URL \u003d bez_hostu." Mniej / reg /? Mode \u003d reg & key \u003d ". MD5 ($ sól); $ Title \u003d "(! Lang: Rejestracja na http: / / strona internetowa"; $message = "Для активации Вашего акаунта пройдите по ссылке ". $url .""; sendMessageMail($_POST["email"], BEZ_MAIL_AUTOR, $title, $message); //Сбрасываем параметры header("Location:". BEZ_HOST ."less/reg/?mode=reg&status=ok"); exit; } } } } ?>!}

    Plik reg_form.html.

    Rejestracja użytkowników PHP MySQL z aktywacją pisania

    E-mail *:
    Hasło *:
    Potwierdzenie hasła *:

    Pola z ikoną * Obowiązkowe do napełniania

    Ponieważ rejestracja użytkowników jest dla nas gotowa, nadszedł czas, aby napisać autoryzację. Utwórz formularz do autoryzacji użytkownika, a następnie napisz obsługę formularza autoryzacji i ostatni skrypt show.php. Który pokaże nam autoryzowany w systemie, czy nie.

    File auth.php.

    0) Echo Widokrografia ($ Err); Inaczej (/ * Utwórz żądanie, aby wybrać z bazy danych, aby sprawdzić użytkownikowi użytkownika * / $ SQL \u003d "Wybierz * od`. Bez_dbprefix." Reg`, gdzie Login` \u003d "". Escape_str ($ _ Post [ "Email"]). "" "I" Status "\u003d 1"; $ RES \u003d MySqlquery ($ SQL); // Jeśli łuki logowania, sprawdź hasło, jeśli (mysql_num_Rows ($ RES)\u003e 0) (// Get)\u003e 0) (// Dane z tabeli $ rzędzie \u003d mysql_fetch_assoc ($ res); jeśli (MD5 (MD5 (MD5 ($ _ Post ["Pass"]). $ rzędu ["Sól"] \u003d\u003d $ rzędu ["Pass"]) ($ _SESS ["Użytkownik"] \u003d True; // Zresetuj parametry nagłówka ("Lokalizacja:". Bez_host. "Mniej / reg /? Mode \u003d auth"); wyjście;) Echo ShotRorMessage ("Login . "$ _POST [" Email "]." nie znaleziono! ");))?\u003e

    Dla tych, którzy mają najnowszą wersję PHP, publikując ten skrypt za pomocą PDO. Dlatego ekspansja MySQL. Jest przestarzały i usuwany z nowej wersji PHP. Pobierz Rejestracja i autoryzacja PHP MySQL PDO

    Archiwum Zaktualizowano 24.02.2015g.

    Uwaga: Jeśli używasz tego skryptu na serwerze typu lokalnego Denwer., Xampp., Nie powinieneś czekać na listy na skrzynce pocztowej. Listy leżą w wtyczce wyślij maila. W Denwer. Możesz je znaleźć po drodze. Z: tmp! Sendmail Otwórz te pliki, które możesz w dowolnym kliencie pocztowym.

    Nauczy się uwierzytelnianie prostych użytkowników na stronie. Na stronie mogą pojawić się strony tylko dla autoryzowanych użytkowników i w pełni funkcjonują, jeśli dodasz do nich nasz blok uwierzytelniania. Aby go utworzyć, potrzebujesz bazy danych MySQL. Może mieć 5 kolumn (minimum), a może więcej, jeśli chcesz dodać informacje o użytkownikach. Nazywamy bazy danych "Userauth".

    Tworzymy w nim następujące pola: Identyfikator do liczenia numeru użytkownika, UID dla unikalnego numeru identyfikacyjnego użytkownika, nazwy użytkownika do nazwy użytkownika, e-mail na adres e-mail i hasło do hasła. Możesz użyć do autoryzacji użytkownika i już istniejącej bazy danych, tylko w przypadku nowej bazy danych, utwórz w nim poniższą tabelę.

    Kod MySQL.

    Utwórz tabelę "Użytkownicy" (ID "Int (11) nie null Auto_increment,` Uid` int (11) Nie Null, `Nazwa użytkownika Tekst nie Null,` Email` Nie , `Password` Tekst nie Null, klucz podstawowy ( `ID`)) Silnik \u003d Domyślny zestaw myisamowy \u003d UTF8 Auto_increment \u003d 1;

    Teraz utworzyć plik "sql.php". Odpowiada za połączenie z bazą danych. Ten kod, najpierw tworzy zmienne dla serwera i użytkownika, gdy łączy się z serwerem. Po drugie, wybierze bazy danych w tym przypadku "Userauth". Ten plik musi być podłączony do "log.php" i "reg.php", aby uzyskać dostęp do bazy danych.

    Kod PHP.

    // Twoja nazwa użytkownika MySQL $ Pass \u003d "Przeprowadzaj"; // hasło $ conn \u003d mysql_connect ($ server, $ user, $ Pass); // połączenie z serwerem $ db \u003d mysql_select_db ("userauth", $ Conn); // Wybierz bazę danych Jeśli (! $ dB) ( // Jeśli nie możesz wybrać bazy danych Echo "przepraszam, błąd: (/\u003e"; // przedstawia komunikat o błędzie Wyjście (); // pozwala pracować z resztą skryptów PHP } ?>

    Następna strona wejścia, niech nazywa się "login.php". Po pierwsze, sprawdza wprowadzone dane dotyczące błędów. Strona ma pola dla nazwy użytkownika, hasła, przycisku Wyślij i link do rejestracji. Gdy użytkownik kliknie przycisk "Login", formularz zostanie przetworzony kodem z pliku "Log.php", a następnie zaloguj się do systemu.

    Kod PHP.

    0) { // jeśli występują błędy sesji $ err \u003d "

    "; // Uruchom tabelę Foreach ($ _Session [" Errmsg "] jako MSG $) ( // Rozpoznawanie każdego błędu $ Err. \u003d " "; // Nagraj go w zmiennej ) $ Err. \u003d "
    "MSG $".
    "; // zamknięcie stołu Nieznacznie ($ _Session ["errmsg"]); // Usuń sesję. } ?> Forma loginu
    Nazwa Użytkownika
    Hasło
    Zameldować się

    Następnie piszemy skrypt, aby się zalogować. Nazwijmy to "log.php". Posiada funkcję do czyszczenia danych wejściowych z zastrzyków SQL, które można zepsuć skrypt. Po drugie, otrzymuje te formy i sprawdza je na poprawność. Jeśli dane wejściowe są poprawne, skrypt wysyła użytkownika na stronie autoryzowanych użytkowników, jeśli nie, ustawia błędy i wysyła użytkownika na stronę logowania.

    Kod PHP.

    // start sesja do nagrywania Funkcja Fix ($ STR) (// Czyszczenie $ Str \u003d Fields Tim ($ STR); If (Get_magic_quotes_GPC () ($ ST \u003d stripslashes ($ ST);) // tablica do oszczędzania błędów $ erflag \u003d false; // Flaga błędu $ Nazwa użytkownika \u003d Fix ($ _ Post ["Nazwa użytkownika"]); //Nazwa Użytkownika $ Hasło \u003d Napraw ($ _ Post ["Hasło"]); // Hasło) // Sprawdzanie hasła. Jeśli ($ hasło \u003d\u003d "") ($ errmsg \u003d "Brak hasła"; // błąd $ Erflag \u003d true; // podnosi flagę w przypadku błędu) // Jeśli flaga błędu zostanie podniesiona, wysyła z powrotem do formularza rejestracyjnego // zapisuje błędy session_write_close (); // sesja zamykająca // przekierowanie Wyjście (); ) // Żądanie bazy danych. $ Qry \u003d "Wybierz * od użytkowników` gdzie` Nazwa użytkownika` \u003d "$ Nazwa użytkownika" i` hasło` \u003d "". MD5 ($ Hasło). "" "; $ wynik \u003d mysql_query ($ qry); // Sprawdź, czy wniosek odniósł sukces (istnieje dane na nim) IF (MySQL_NUM_ROWS ($ Wynik) \u003d\u003d 1) (While ($ Row \u003d MySQL_Fetch_assoc ($ Wynik)) ($ _Session ["UID"] \u003d $ rzędu ["UID"]; // Otrzymuj UID z bazy danych i umieść go na sesji $ _Session ["nazwa użytkownika"] \u003d nazwa użytkownika $; // ustawia, czy nazwa użytkownika zbiega się z sesją session_write_close (); // sesja zamykająca Nagłówek ("Lokalizacja: członek.php"); // przekierowanie )) Inna ($ _Session ["Errmsg"] \u003d "Nieprawidłowa nazwa użytkownika lub hasło"; // błąd session_write_close (); // sesja zamykająca Nagłówek ("Lokalizacja: login.php"); // przekierowanie Wyjście (); )?\u003e.

    Zróbmy stronę rejestracji, zadzwoń do tego "Zarejestruj się.php". Wygląda na stronę logowania, ma tylko kilka pól więcej, a zamiast rejestracji - link do logowania.php na wypadek, gdyby użytkownik ma konto.

    Kod PHP.

    0) { // jeśli występują błędy sesji $ err \u003d "

    "// Uruchom tabelę Foreach ($ _Session [" Errmsg "] jako MSG $) ( // Ustawia każdy błąd $ Err. \u003d " "; // zapisuje je do zmiennej ) $ Err. \u003d "
    "MSG $".
    "; // koniec nieustartowej tabeli ($ _Session [" Errmsg "]); // niszczy sesję } ?> Formularz rejestracyjny
    Nazwa Użytkownika
    E-mail
    Hasło
    Powtórz hasło
    Mam konto

    Teraz wykonamy skrypt rejestracyjny w pliku "Reg.php". Zostanie on włączony "sql.php", aby połączyć się z bazą danych. Ta sama funkcja jest również używana, jak w skrypcie wejściowym, aby wyczyścić pole wejściowe. Zainstalowane zmienne do możliwych błędów. Następnie - funkcja tworzenia unikalnego identyfikatora, który nigdy wcześniej nie został dostarczony. Następnie zostaną pobrane dane z formularza rejestracyjnego i sprawdzone. Istnieje sprawdzenie, czy adres e-mail jest określony w żądanym formacie, a także niezależnie od tego, czy hasło jest prawidłowo określone. Następnie skrypt sprawdza, czy baza danych użytkownika jest z taką samą nazwą, a jeśli występuje raporty o błędzie. I wreszcie kod dodaje użytkownika do bazy danych.

    Kod PHP.

    // start sesja do nagrywania Funkcja Fix ($ STR) (// Cleaning Field $ $ Str \u003d @trim ($ STR); jeśli (Get_magic_quotes_GPC () ($ Str \u003d Stripslashes ($ STR);) powrót mysql_real_escape_string.($ Str); ) $ errmsg \u003d tablica (); // tablica do przechowywania błędów $ erflag \u003d false; // Błąd flagi $ UID \u003d "1232354353452345345146545454"; // Unikalny identyfikator $ Nazwa użytkownika \u003d Fix ($ _ Post ["Nazwa użytkownika"]); //Nazwa Użytkownika $ e-mail \u003d $ _Post ["Email"]; // Email $ Hasło \u003d Napraw ($ _ Post ["Hasło"]); // hasło $ rPpassword \u003d Fix ($ _ Post ["rPpassword"]); // Powtórz hasło // Sprawdź nazwę użytkownika Jeśli ($ username \u003d\u003d "") ($ errmsg \u003d "Brak nazwy użytkownika"; // błąd $ Erflag \u003d true; // podnosi flagę w przypadku błędu ) // Sprawdź e-maila, jeśli (! EREGI ("^ [_ A-Z0-9 -] + ([_ A-Z0-9 -] +) * @ + (. +) * (. (2.3 )) $ ", $ e-mail)) (// musi być zgodny z formatem: [Chroniony e-mail] $ errmsg \u003d "Nieprawidłowy e-mail"; // błąd $ errflag \u003d true; // podnosi flagę w przypadku błędu } // Sprawdzanie hasła. Jeśli ($ hasło \u003d\u003d "") ($ errmsg \u003d "Brak hasła"; // Błąd $ Erflag \u003d true; // podnosi flagę w przypadku błędu } // Sprawdzanie powtarzania hasła Jeśli ($ rPpassword \u003d\u003d "") ($ errmsg \u003d "Brakujące hasło powtarzające się"; // błąd $ errflag \u003d true; // podnosi flagę w przypadku błędu } // Walidacja hasła Jeśli (STRCMP ($ Hasło, $ rPpassword)! \u003d 0) ($ errmsg \u003d "Hasła nie pasują do"; // błąd $ Erflag \u003d true; // podnosi flagę w przypadku błędu } // Sprawdź, czy nazwa użytkownika jest bezpłatna Jeśli ($ username! \u003d "") ($ Qry \u003d "Wybierz * od" Użytkownicy`, gdzie "Nazwa użytkownika" \u003d "$ Nazwa użytkownika" "; // Żądanie do MySQL $ Result \u003d MySQL_Query ($ Qry); (jeśli (MySQL_NUM_ROWS ($ Wynik)\u003e 0) ( // jeśli nazwa jest już używana $ errmsg \u003d "nazwa użytkownika już używana"; // Komunikat o błędzie $ Errflag \u003d prawda; // podnosi flagę w przypadku błędu ) mysql_free_result ($ wynik); )) // Jeśli dane nie przeszły walidacji, kieruje się z powrotem do formularza rejestracyjnego Jeśli ($ Erflag) ($ _Session ["Errmsg"] \u003d $ Errmsg; // Komunikat o błędzie session_write_close (); // sesja zamykająca Nagłówek ("Lokalizacja: zarejestruj się.php"); // przekierowanie Wyjście (); ) // Dodawanie danych do bazy danych $ Qry \u003d "Wstaw do" userauth ".sers` (`UID`,` Nazwa użytkownika`, `Email`,` Hasło`) ". MD5 ($ Hasło)." ")"; $ wynik \u003d mysql_query ($ qry); // Sprawdź, czy udane prośba o dodanie Jeśli ($ wynik) (echo "Dziękujemy za rejestrację" Nazwa użytkownika $. " tutaj"; Wyjdź ();) inaczej (umrzeć (" Błąd, patrz później ");)?\u003e

    Nadal musisz wykonać skrypt, aby wyjść z użytkownika z systemu. Zatrzymuje sesję użytkownika z tym unikalnym identyfikatorem i nazwą, a następnie przekierowuje użytkownika na stronie logowania.

    Kod PHP.

    Wreszcie skrypt "Auth.php" może być używany do udostępniania stron tylko dla autoryzowanych użytkowników. Sprawdza dane wejściowe i, jeśli są poprawne, umożliwia użytkownikowi przeglądanie stron, a jeśli nie, prosi o zalogowanie się. Ponadto, jeśli ktoś próbuje włamać się do witryny, tworząc jedną z sesji, zostanie przerwany jako ogólnie.

    Kod PHP.

    Jednym z warunków w powyższym kodzie jest przedmiotem pytania.

    Poniższy kod musi być włożony do strony dla autoryzowanych użytkowników, nazywa się, na przykład "członek.php", a możesz zostać wywołany, jak chcesz.

    Kod PHP.

    Masz dostęp do tej strony. Wychodzić ( )

    Uwierzytelnianie użytkownika jest gotowe!

    Dzwon.

    Są ci, którzy przeczytali tę wiadomość przed tobą.
    Subskrybuj odbieranie artykułów świeżych.
    E-mail
    Nazwa
    Nazwisko
    Jak chcesz przeczytać dzwonek
    Bez spamu