DZWONEK

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
Email
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu

Sesja technologiczna w Php  są łatwym sposobem przechowywania informacji dla pojedynczego użytkownika witryny. Na przykład: produkty dodane do koszyka, ustawienia powiadomień itp. Gdy witryna po raz pierwszy żąda serwera, w przeglądarce zapisywany jest unikalny plik cookie identyfikator sesji  użytkownik. Następnie identyfikator lub wiązka identyfikatorów z adresem IP identyfikuje użytkownika. Można to wykorzystać do utrzymania stanu między żądaniami stron. Identyfikatory sesji są zazwyczaj wysyłane do przeglądarki za pośrednictwem pliku cookie sesji i służą do pobierania dostępnych danych sesji.

Sesje wykorzystują prostą technologię: PHP pobierze dane z istniejącej sesji przy użyciu przekazanego identyfikatora (zwykle z sesji) ciasteczko) lub jeśli nic nie zostało przesłane, zostanie utworzona nowa sesja. PHP zapełni zmienną superglobalną $ _SESSION informacjami o sesji po jej rozpoczęciu. Gdy PHP zamyka się, automatycznie serializuje zawartość zmiennej superglobalnej $ _SESSION i wysyła ją do zapisania, używając procedury obsługi sesji do zarejestrowania sesji.

Domyślnie PHP używa wewnętrznego modułu obsługi. pliki  aby zapisać sesje, które są ustawione w zmiennej INI session.save_handler. Ten moduł obsługi przechowuje dane na serwerze w katalogu określonym w dyrektywie konfiguracyjnej session.save_path.

Najprostszy przykład użycia sesji, na przykład wyświetlenie liczby odsłon strony dla każdego użytkownika:

Jak możliwe jest blokowanie sesji?

Na stronie php znajduje się uwaga w sekcji opisu sesji (http://php.net/manual/ru/session.examples.basic.php):

Sesje z wykorzystaniem plików (domyślnie w Php), blokuj plik sesji natychmiast po otwarciu sesji za pomocą funkcji session_start () lub pośrednio, gdy określono session.auto_start. Po zablokowaniu żaden inny skrypt nie może uzyskać dostępu do tego samego pliku sesji, dopóki nie zostanie zamknięty ani po zakończeniu skryptu, ani po wywołaniu funkcji session_write_close ().

Najprawdopodobniej stanie się to problemem dla witryn, które aktywnie korzystają Ajax  i złożyć kilka jednoczesnych wniosków. Najłatwiejszym sposobem rozwiązania tego problemu jest wywołanie funkcji session_write_close (), gdy tylko wszystkie wymagane zmiany w sesji zostaną wprowadzone, najlepiej bliżej początku skryptu. Możesz także użyć innego silnika sesji, który obsługuje równoczesny dostęp.

Ostatnio problem blokowania sesji staje się coraz częstszy. Wynika to częściowo ze złożoności witryn i potrzeby wykonywania większej ilości obliczeń po stronie serwera, a także z większej dystrybucji Ajax. Niestety logika aplikacji nie zawsze, szczególnie jeśli jest złożona, może skutecznie ograniczyć czas blokowania procesów konkurujących o sesję. Sytuację dodatkowo pogarsza fakt, że 3-5 takich klientów może zostać szybko zabitych przez pracowników PHP, którzy utknęli i bezczynnie czekają na procesy, co powoduje powstanie strony internetowej zacznie wydawać Błąd 5XX .

Najprostszy przykład blokowania sesji:

// tylko dla jednego skryptu ?>

Jeśli otworzysz ten plik najpierw w pierwszej zakładce, a następnie w drugiej - druga zakładka zaczeka na zakończenie pierwszej. Oznacza to, że druga karta będzie czekać, aż pierwsza zwolni plik sesji (co w danym przypadku zajmuje 30 sekund). Ten problem jest dobrze opisany na blogu firmy. 1C-Bitrix  w Habrahabr.

Jakie są opcje rozwiązania tego problemu?

Do przechowywania sesji możesz użyć baz danych takich jak MySQL  lub PostgreSQL  (co nie jest całkowicie poprawne, biorąc pod uwagę możliwości większości baz danych i możliwą szybkość pracy w tym zadaniu), Memcached  (nie gwarantuje przechowywania sesji, można ją usunąć) i Redisktóre rozważamy optymalne przechowywanie. Szybkość nie jest gorsza od Memcached, ale jednocześnie może zagwarantować bezpieczeństwo danych.

I najważniejsza zaleta Redis  - podczas przechowywania sesji nie są one blokowane.

W ramach naszego panelu sterowania () możesz włączyć przechowywanie sesji w Redis dla wszystkich witryn na swoim koncie. Aby to zrobić, przejdź do „ Witryny„i dalsze zaznaczanie” - Przechowuj sesje wszystkich witryn w Redis".

Dodatkowe materiały

Sekcje

Ssh

FTP

Aplikacje internetowe

  • Przegląd instalacji aplikacji (środowisko wirtualne Docker)

Diagnostyka problemów

Domeny

  • Anulowanie nazwy domeny w strefie .RU / .РФ, dla której Beget jest rejestratorem
  • Przeniesienie praw administracyjnych do nazwy domeny .RU / .РФ / .SU i stref międzynarodowych (zmiana administratora domeny)

.
  W tym artykule dodamy do naszej rejestracji sprawdźe- mailadresy, automatyczne logowanie i odzyskiwanie hasła. Przed rozpoczęciem lekcji upewnij się, że funkcja działa na twoim serwerze mail ().

Zacznijmy od dodania pól do tabeli. « użytkownicy» . Potrzebujemy pola do przechowywania adresów e-mail, pola statusu użytkownika (0 - nieaktywne, 1 - aktywowane) oraz pola z datą rejestracji.





Następnie musisz to naprawić save_user.phpdodając sprawdzenie poprawności adresu e-mail i wysyłając wiadomość e-mail w celu potwierdzenia rejestracji. List zawiera link z dwiema zmiennymi przekazanymi metodą get :   zaloguj się i wygeneruj, unikalny dla każdego kodu użytkownika. Potrzebujemy kodu, aby użytkownik nie mógł aktywować swojego konta bez pisania, a to da nam pewność, że podany adres e-mail naprawdę należy do niego. Dodaj następujący kod po pobraniu wysłanych danych ze zmiennych globalnych:

If (isset ($ _ POST [„email”])) ($ email \u003d $ _POST [„email”]; if ($ email \u003d\u003d ””) (unset ($ email);))
  jeśli (pusty ($ login) lub pusty ($ hasło) lub pusty ($ kod) lub pusty ($ email))
// dodaj zmienną za pomocąe- mailadres
// jeśli użytkownik nie podał nazwy użytkownika ani hasła, wówczas zgłaszamy błąd i zatrzymujemy skrypt
{
   wyjdź („Nie wprowadziłeś wszystkich informacji, wróć i wypełnij wszystkie pola!”); // zatrzymać wykonywanie skryptu
}
  if (! preg_match ("/ [chroniony e-mailem]+ \\. (2,3) / i ", $ email)) // sprawdź poprawność adresu e-mail za pomocą wyrażeń regularnych
  (exit („Nieprawidłowy e-mail!”);)

We wniosku o dodanie nowego użytkownika konieczne jest dodanie daty rejestracji. Jeśli dane zostały pomyślnie wstawione do bazy danych, a użytkownik jest zarejestrowany, musisz wysłać wiadomość na podany adres:

// jeśli tak nie jest, zapisz dane
  $ wynik2 \u003d mysql_query („WSTAWIĆ do użytkowników (login, hasło, awatar, adres e-mail, data) WARTOŚCI („ $ login ”,„ $ hasło ”,„ $ avatar ”,„ $ email ”, NOW ())”);
// Sprawdź błędy
  if ($ wynik2 \u003d\u003d „PRAWDA”)
{
$ wynik3 \u003d kwerenda_mysql („WYBIERZ identyfikator od użytkowników GDZIE login \u003d„ $ login ””, $ db); // pobierz identyfikator użytkownika. Dzięki niemu otrzymamy unikalny kod aktywacyjny, ponieważ nie mogą istnieć dwa identyczne identyfikatory.
  $ myrow3 \u003d mysql_fetch_array ($ wynik3);
  $ aktywacja \u003d md5 ($ myrow3 [„id”]). md5 ($ login); // kodaktywacjakonto. Szyfrujemy identyfikator i login za pomocą funkcji md5. Jest mało prawdopodobne, aby użytkownik mógł wybrać taką kombinację ręcznie za pomocą paska adresu.
  $ subject \u003d „Potwierdzenie rejestracji”; // temat wiadomości
  $ message \u003d "Witaj! Dziękujemy za rejestrację na citename.ru \\ nTwoja nazwa użytkownika:". $ login. "\\ n
  Kliknij link, aby aktywować swoje konto: \\ nhttp: //localhost/test3/activation.php? Login \u003d ". $ Login." & Code \u003d ". $ Activation." \\ N Z poważaniem, \\ n
  Administracja citename.ru "; // treść wiadomości
  mail ($ email, $ subject, $ message, "Content-type: text / plane; Charset \u003d windows-1251 \\ r \\ n"); // wyślij wiadomość

Echo „Wysłano do ciebie wiadomość e-mail z linkiem potwierdzającym rejestrację. Uwaga! Link jest ważny przez 1 godzinę. Strona główna”; // porozmawiaj o wysłanym liście do użytkownika
}

Wiadomość wysłana! Teraz użytkownik go otworzy i podany link do strony, która sprawdzi kod aktywacyjny. Po upewnieniu się, że kod jest poprawny, potwierdzamy rejestrację, zmieniając wartość pola w bazie danych aktywacja  od „0” do „1”.

Utwórz plik aktywacja. php

  include („bd.php”); // plikbd. php  powinien znajdować się w tym samym folderze, co wszyscy inni. Jeśli tak nie jest, po prostu zmień ścieżkę
  $ result4 \u003d mysql_query („WYBIERZ awatar OD użytkowników, GDZIE aktywacja \u003d„ 0 ”I UNIX_TIMESTAMP () - UNIX_TIMESTAMP (data)\u003e 3600”); // pobierz awatary tych użytkowników, którzy nie aktywowali konta przez godzinę. Dlatego należy je usunąć z bazy danych, a także z plików awatarów
  if (mysql_num_rows ($ result4)\u003e 0) (
  $ myrow4 \u003d mysql_fetch_array ($ wynik4);
  zrobić
{
// usuń awatary w pętli, jeśli nie są standardowe
  if ($ myrow4 ["avatar"] \u003d\u003d "avatars / net-avatara.jpg") ($ a \u003d „Nic nie rób”;)
  else (
  unlink ($ myrow4 [„avatar”]); // usuń plik
}
}
   while ($ myrow4 \u003d mysql_fetch_array ($ wynik4));
}
  mysql_query („USUŃ OD UŻYTKOWNIKÓW GDZIE aktywacja \u003d„ 0 ”ORAZ UNIX_TIMESTAMP () - UNIX_TIMESTAMP (data)\u003e 3600”); // usuń użytkowników z bazy danych
  if (isset ($ _ GET [„code”])) ($ code \u003d $ _ GET [„code”];) // kod potwierdzający
  jeszcze
  (wyjście („Poszedłeś na stronę bez kodu weryfikacyjnego!”);) // jeśli nie podanokodwtedy dajemy błąd
if (isset ($ _ GET [„login”])) ($ login \u003d $ _ GET [„login”];) // zaloguj się, aby aktywować
  jeszcze
  (wyjście („Poszedłeś na stronę bez loginu!”);) // jeśli nie podałeś loginu, wówczas zgłaszamy błąd
  $ result \u003d mysql_query („WYBIERZ identyfikator od użytkowników GDZIE login \u003d„ $ login ””, $ db); // pobierz identyfikator użytkownika z tym loginem
  $ aktywacja \u003d md5 ($ myrow [„id”]). md5 ($ login); // utwórz ten sam kod potwierdzający
  if ($ aktywacja \u003d\u003d $ kod) ( // porównanie uzyskane zadres URL  i wygenerowany kod
  mysql_query („UPDATE users SET aktywacja \u003d” 1 ”WHERE login \u003d„ $ login ””, $ db); // jeśli jest równy, aktywuj użytkownika
  echo "Twój adres e-mail został potwierdzony! Teraz możesz uzyskać dostęp do witryny przy użyciu swojej nazwy użytkownika! Strona główna";
}
  else (echo „Błąd! Twój adres e-mail nie został potwierdzony! Strona główna”;
// jeśli otrzymano odadres URL  a wygenerowany kod nie jest równy, wtedy pojawia się błąd
}
?>

Adres e-mail został potwierdzony, teraz wiemy, że ten adres należy do tego użytkownika, możliwe będzie wysłanie do niego hasła, jeśli użytkownik go zapomni lub inne powiadomienia. Ale jaka jest różnica między aktywowanymi użytkownikami a nieaktywowanymi? Oba mogą wejść na stronę, dlatego musimy ograniczyć nieaktywny dostęp. Otwórz plik testreg. php  i dodaj jeszcze jeden warunek do zapytania do bazy danych:

   $ result \u003d mysql_query ("WYBIERZ * OD UŻYTKOWNIKÓW GDZIE login \u003d" $ login "ORAZ hasło \u003d" $ hasło "ORAZ aktywacja \u003d" 1 ", $ db); // wydobywamy z bazy danych wszystkie dane o użytkowniku z wprowadzonym loginem
// dodaliśmy „Iaktywacja\u003d „1” », tzn. Użytkownik będzie przeszukiwany tylko wśród aktywowanych. Wskazane jest dodanie tego warunku do innych podobnych kontroli danych użytkownika.

Jeśli użytkownik zapomni hasło, w takim przypadku musisz wyświetlić link na stronie głównej, na którym może go odzyskać, a także możesz natychmiast ustawić pole wyboru dla automatycznego logowania.

  Automatyczne logowanie






  Zarejestruj się


  Nie pamiętasz hasła?

Jest link, ale nie ma pliku. Napiszmy wyślij_ zdać. php. W nim poprosimy użytkownika o nazwę użytkownika i adres e-mail. Jeśli wprowadzony adres e-mail i login znajdują się w bazie danych, wyślemy do niego nowe hasło, jeśli użytkownik zapomniał stare, ponieważ podczas rejestracji upewniliśmy się, że adres e-mail jest prawidłowy.

  if (isset ($ _ POST [„login”])) ($ login \u003d $ _POST [„login”]; if ($ login \u003d\u003d ””) (unset ($ login);))   // wprowadź login wprowadzony przez użytkownika do zmiennej $ login, jeśli jest pusty, a następnie zniszcz zmienną
  if (isset ($ _ POST [„email”])) ($ email \u003d $ _POST [„email”]; if ($ email \u003d\u003d ””) (unset ($ email);)) // wprowadź adres e-mail wprowadzony przez użytkownika, jeśli jest pusty, a następnie zniszcz zmienną
  if (isset ($ login) i isset ($ email)) ( // jeśli to konieczne, istnieją zmienne

Uwzględnij („bd.php”);

  $ result \u003d mysql_query („WYBIERZ identyfikator od użytkowników GDZIE login \u003d„ $ login ”ORAZ email \u003d„ $ email ”ORAZ aktywacja \u003d„ 1 ””, $ db); // takieczyo godzużytkownike- mail
  $ myrow \u003d mysql_fetch_array ($ wynik);
  if (pusty ($ myrow ["id"]) lub $ myrow ["id"] \u003d\u003d "") (
// jeśli nie ma aktywowanego użytkownika z takim loginem i adresem e-mail
  exit („W żadnej bazie danych CIA nie znaleziono użytkownika o tym adresie e-mail :) Strona główna”);
}
// jeśli zostanie znaleziony użytkownik z takim loginem i e-mailem, musisz wygenerować dla niego losowe hasło, zaktualizować je w bazie danych i wysłać na e-mail
  $ datenow \u003d data („YmdHis”); // pobierz datę
  $ nowe_hasło \u003d md5 ($ datenow); // zaszyfruj datę
  $ nowe_hasło \u003d substr ($ nowe_hasło, 2, 6); // wyodrębnij 6 znaków z szyfru, zaczynając od drugiego. To będzie nasze losowe hasło. Następnie zapisujemy go w bazie danych, szyfrując w taki sam sposób, jak zwykle.

  $ nowe_hasło_sh \u003d strrev (md5 ($ nowe_hasło)). "b3p6f"; // zaszyfrowane
  mysql_query ("UPDATE users SET password \u003d" $ new_password_sh "WHERE login \u003d" $ login "", $ db); // zaktualizowanewbaza
// utwórz wiadomość

  $ message \u003d "Witaj,". $ login. "! Wygenerowaliśmy dla ciebie hasło, teraz możesz zalogować się do citename.ru za jego pomocą. Po zalogowaniu zaleca się jego zmianę. Hasło: \\ n". $ new_password; // tekst wiadomości
  mail ($ email, „Odzyskiwanie hasła”, $ wiadomość, „Typ zawartości: tekst / samolot; Charset \u003d windows-1251 \\ r \\ n”); // wyślijwiadomość

Echo ” Wiadomość e-mail z hasłem została wysłana na Twój adres e-mail. Zostaniesz przeniesiony za 5 sekund. Jeśli nie chcesz czekać, kliknij tutaj. "; // przekieruj użytkownika
}
  else ( // jeśli dane nie zostały jeszcze wprowadzone
  echo ”


Nie pamiętasz hasła?


Nie pamiętasz hasła?



  Wpisz swoją nazwę użytkownika:



  Wpisz swój adres e-mail:






";
}
?>

Następnie zrobimy automatyczne logowanie. Będzie to działało w ten sposób: jeśli zalogujesz się z wciśniętym polem wyboru, w pliku cookie zostanie wprowadzone auto \u003d „tak”. Jeśli serwer zauważy, że auto \u003d „tak” w przeglądarce, rozpocznie sesję i weźmie zmienne w pliku cookie. Następnie następuje weryfikacja uruchomionych sesji w bazie danych.

Otwórz testreg. php  i dodaj kod po udanym zalogowaniu:

Jeśli (isset ($ _ POST [„save”]))) (
// Jeśli użytkownik chce, aby jego dane zostały zapisane do późniejszego logowania, należy zapisać je w przeglądarce plików cookie

  setcookie („id”, $ myrow [„id”], time () + 9999999);)
if (isset ($ _ POST [„autovhod”]))) (
// Jeśli użytkownik chce automatycznie wejść na stronę
setcookie („auto”, „tak”, czas () + 9999999);
  setcookie („login”, $ _POST [„login”], time () + 9999999);
  setcookie („hasło”, $ _POST [„hasło”], time () + 9999999);
  setcookie („id”, $ myrow [„id”], time () + 9999999);)

Teraz musisz rozpocząć sesję we właściwym miejscu, jeśli nastąpi automatyczne logowanie. Otwórz index.php  i napisz na samym początku strony:

// cała procedura działa w sesjach. To w nim przechowywane są dane użytkownika, gdy jest on na stronie. Bardzo ważne jest, aby uruchomić je na samym początku strony !!!
  session_start ();
  include („bd.php”); // plik bd.php powinien znajdować się w tym samym folderze, co wszyscy inni, jeśli tak nie jest, po prostu zmień ścieżkę
  if (isset ($ _ COOKIE ["auto"]) i isset ($ _ COOKIE ["login"]) i isset ($ _ COOKIE ["hasło"]))
{// jeśli są niezbędne zmienne
  if ($ _COOKIE [„auto”] \u003d\u003d „yes”) ( // jeśli użytkownik chce się zalogować automatycznie, uruchom sesję
  $ _SESSION [„hasło”] \u003d strrev (md5 ($ _ COOKIE [„hasło”])). „B3p6f”; // w ciasteczkach hasło nie było zaszyfrowane, ale w sesjach zwykle przechowujemy zaszyfrowane
  $ _SESSION [„login”] \u003d $ _ COOKIE [„login”]; // sesjazzaloguj się
  $ _SESSION ["id"] \u003d $ _ COOKIE ["id"]; // identyfikator użytkownika
}
}

Teraz nawet wyjście nam nie pomoże, aby zmienić użytkownika! W wyjście. php  sesje, które są nadal tworzone indeks. phpDzięki ciasteczkom, które są przechowywane przez bardzo długi czas! Naprawmy plik wyjście. phpw przeciwnym razie nie działa w przypadku automatycznego logowania. Wszystko, co musisz zrobić, to wyczyścić plik cookie z automatycznego logowania po usunięciu zmiennych z sesji:

Setcookie („auto”, „”, czas () + 9999999); // wyczyść automatyczne logowanie

Konieczne jest również dodanie do aktualizacja_ użytkownik. php  po aktualizacji loginu w sesji:

   $ _SESSION [„login”] \u003d $ login; // Zaktualizuj logowanie w sesji
  if (isset ($ _ COOKIE [„login”]))) (
  setcookie („login”, $ login, time () + 9999999); // Aktualizacjazaloguj sięwciasteczka
}

To samo dotyczy hasła

   $ result4 \u003d mysql_query („UPDATE users SET password \u003d” $ password ”WHERE login \u003d" $ old_login "", $ db); // aktualizacjahasło
  if ($ result4 \u003d\u003d „TRUE”) ( // jeśli true, to zaktualizuj go w sesji
  $ _SESSION [„hasło”] \u003d $ hasło;
  if (isset ($ _ COOKIE [„hasło”]))) (
  setcookie („hasło”, $ _ POST [„hasło”], time () + 9999999); // Aktualizacjahasłowciasteczka, jeślioni sąjest tam
}

Cóż, to wszystko. Mam nadzieję, że ci się uda! Powodzenia

Sesje  - Jest to mechanizm, który pozwala przechowywać określone dane na serwerze, które są unikalne dla każdego użytkownika. Szczególnie uważni czytelnicy znajdą podobieństwa ciasteczko. I ogólnie rzecz biorąc, jest to to samo. Jednak kluczowy punkt: dane nie są przechowywane w przeglądarce użytkownika, ale w specjalnym pliku na serwerzektórego nazwa jest unikalna dla każdego użytkownika. Wyjątkowy identyfikator sesji PHP  przechowywane już w ciasteczko.

Chodźmy z tobą pracujmy z sesjami w PHP. I zacznij od funkcje session_start (). Ta funkcja wykonuje następujące czynności: jeśli użytkownik zaloguje się po raz pierwszy, tworzy niepowtarzalny identyfikator i zapisuje go ciasteczko, a także tworzy nowy plik, ponownie unikalny dla użytkownika. Jeśli użytkownik już się zalogował, serwer odczytuje wartość unikalnego identyfikatora ciasteczko  i zgodnie z nim odnosi się do pożądanego pliku sesji. Z tego pliku Php  odczytuje wszystkie dane i umieszcza je w tablicy $ _SESSION. Napiszmy prosty kod, w którym piszemy zmienną do sesji, lub czytamy, jeśli już została zapisana.

  session_start ();
  if (isset ($ _ SESSION [„name”])) $ name \u003d $ _SESSION [„name”];
  else $ _SESSION [„name”] \u003d „15St”;
  echo $ nazwa;
?>

Najpierw dzwonimy funkcja session_start ()które opisałem powyżej. Następnie sprawdzamy: czy „ imię"w sesji. Jeśli istnieje, to przeczytaj dane z niej i zapisz do zmiennej imię. Jeśli nie istnieje (tzn. Użytkownik przyszedł po raz pierwszy), ustaw zmienną „ imię„wartość sesji” 15St.". W następnym wierszu wyświetlana jest wartość zmiennej $ nazwa. Oczywiście przy pierwszym uruchomieniu zobaczysz pustą linię, ale przy drugim zobaczysz linię „ 15St.„czytać z sesji.

Sugeruję wpisanie w pasku adresu: „ javascript: document.cookie„(wprowadź tę samą kartę, na której uruchomiono skrypt). W rezultacie zobaczysz coś takiego:” PHPSESSID \u003d". Tylko znaczenie PHPSESSID  i tym samym jest unikalnym identyfikatorem.

Aby wszystko stało się całkowicie jasne, radzę nawet znaleźć plik sesji. Jeśli użyjesz Denwer, to leży w folderze „ tmpMsgstr ". Spójrz na pliki zaczynające się od." sess_„- to są te same pliki sesji. Możesz je otworzyć w prostym notatniku.

Inną bardzo ważną właściwością jest czas sesji w PHP. Więc jeśli ciasteczko  przechowywane, dopóki nie zostaną usunięte przez przeglądarkę. Przeglądarka nigdy nie usuwa ich domyślnie. Ta sesja przechowuje czas określony w ustawienia PHP. Domyślnie to 15   minut To znaczy, jeśli będziesz używać uwierzytelnianie oparte na sesjinastępnie po 15 minutach bezczynność  użytkownik będzie musiał się ponownie zalogować. Oczywiście jest to dobre, ponieważ jeśli użytkownik zapomni „ Wyjdź", wtedy nic złego się nie stanie. Osoba atakująca nie będzie mogła korzystać z konta użytkownika. Co więcej, kiedy za pomocą ciasteczka  mogą zostać skradzione, zastąpione w przeglądarce, w wyniku czego osoba atakująca jest autoryzowana na podstawie danych innych osób, nawet nie znając hasła. Nie można jednak skradzić sesji, ponieważ wszystkie parametry są przechowywane na serwerze, a Ty nie możesz się o nich dowiedzieć.

Dlatego staraj się głównie w swojej praktyce użyj sesjizamiast czystego ciasteczko.

Na koniec chcę ostrzec przed bardzo częstym błędem. Nigdy nie wysyłaj danych do przeglądarek, dopóki użyj funkcji session_start ()w przeciwnym razie spowoduje błąd. Oznacza to, że nie możesz pisać w ten sposób:

  echo „Cześć”;
  session_start ();
?>

Wystąpi błąd podczas uruchamiania tego skryptu. Ta sama zasada dotyczyła ciasteczko (funkcja setcookie ()) Myślę, że tutaj wszystko jest jasne.

Co do sesje PHP, oczywiście można ich używać do przechowywania statystyk, uwierzytelniania, ustawień użytkownika i innych podobnych rzeczy.

Nauczymy się przeprowadzać proste uwierzytelnianie użytkowników na stronie. Witryna może zawierać strony tylko dla autoryzowanych użytkowników i będą one w pełni funkcjonować, jeśli dodasz do nich naszą jednostkę uwierzytelniającą. 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. Nazwijmy bazę danych „Userauth”.

Utwórz w nim następujące pola: ID do zliczania liczby użytkowników, UID dla unikalnego numeru identyfikacyjnego użytkownika, Nazwa użytkownika dla nazwy użytkownika, E-mail dla jego adresu e-mail i Hasło dla hasła. Możesz użyć bazy danych, którą już posiadasz do autoryzacji, podobnie jak w przypadku nowej bazy danych, utwórz w niej poniższą tabelę.

Kod MySQL

UTWÓRZ TABELĘ `użytkowników` (` ID` int (11) NOT NULL AUTO_INCREMENT, `UID` int (11) NOT NULL,` Nazwa użytkownika` tekst NOT NULL, `Email` tekst NOT NULL, tekst` Hasło` NOT NULL, KLUCZ PODSTAWOWY (`ID ')) SILNIK \u003d DOMYŚLNY KARTA MyISAM \u003d utf8 AUTO_INCREMENT \u003d 1;

Teraz utwórz plik „sql.php”. Odpowiada za połączenie z bazą danych. Ten kod, po pierwsze, tworzy zmienne dla serwera i użytkownika, gdy łączy się z serwerem. Po drugie, wybierze bazę 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 "redere"; // hasło $ conn \u003d mysql_connect ($ server, $ user, $ pass); // połączenie z serwerem   $ db \u003d mysql_select_db ("userauth", $ conn); // wybierz bazę danych   if (! $ db) ( // jeśli nie można wybrać bazy danych   echo "Przepraszamy, błąd: (/\u003e"; // Pokaż komunikat o błędzie   exit (); // Pozwala na działanie innych skryptów PHP } ?>

Dalej jest strona logowania, niech nazywa się „login.php”. Po pierwsze, sprawdza wprowadzone dane pod kątem błędów. Strona zawiera pola na nazwę użytkownika, hasło, przycisk przesyłania i link rejestracyjny. Gdy użytkownik kliknie przycisk „Zaloguj się”, formularz zostanie przetworzony przez kod z pliku „log.php”, a następnie system zostanie zalogowany.

Kod PHP

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

"; // Uruchom tabelę foreach ($ _SESSION [„ ERRMSG ”] jako $ msg) ( // rozpoznanie każdego błędu   $ err. \u003d " "; // zapisz to do zmiennej   ) $ err. \u003d "
„. $ msg.”
"; // zamknij stół   unset ($ _SESSION [„ERRMSG”]); // usuń sesję } ?> Formularz logowania
Nazwa użytkownika
Hasło
Rejestracja

Następnie piszemy skrypt, aby wejść do systemu. Nazwijmy to „log.php”. Ma funkcję usuwania danych wejściowych z zastrzyków SQL, które mogą zepsuć skrypt. Po drugie, otrzymuje dane formularza i sprawdza poprawność. Jeśli dane wejściowe są prawidłowe, skrypt wysyła użytkownika na stronę autoryzowanych użytkowników, jeśli nie, ustawia błędy i wysyła użytkownika na stronę logowania.

Kod PHP

// początek sesji do pisania   funkcja Fix ($ str) (// wyczyść pola $ str \u003d trim ($ str); if (get_magic_quotes_gpc ()) ($ str \u003d stripslashes ($ str);) // tablica do zapisywania błędów   $ errflag \u003d false; // flaga błędu $ nazwa użytkownika \u003d Poprawka ($ _ POST [„nazwa użytkownika”]); // nazwa użytkownika   $ hasło \u003d Poprawka ($ _ POST [„hasło”]); // hasło) // sprawdzenie hasła   if ($ hasło \u003d\u003d "") ($ errmsg \u003d "Brak hasła"; // error $ errflag \u003d true; // podnieś flagę w przypadku błędu) // jeśli flaga błędu zostanie podniesiona, nastąpi powrót do formularza rejestracyjnego // zapisuj błędy   session_write_close (); // zamknij sesję // przekierowanie   exit (); ) // zapytanie do bazy danych   $ qry \u003d "WYBIERZ * OD` użytkowników` GDZIE` Nazwa użytkownika` \u003d "$ nazwa użytkownika" ORAZ `Hasło` \u003d" ". md5 ($ hasło)." ""; $ wynik \u003d mysql_query ($ qry); // sprawdź, czy żądanie powiodło się (czy są na nim dane)   if (mysql_num_rows ($ wynik) \u003d\u003d 1) (while ($ row \u003d mysql_fetch_assoc ($ wynik)) ($ _SESSION [„UID”] \u003d $ row [„UID”]; // pobierz identyfikator UID z bazy danych i umieść go w sesji   $ _SESSION [„USERNAME”] \u003d $ nazwa użytkownika; // ustawia, czy nazwa użytkownika pasuje do sesji   session_write_close (); // zamknij sesję nagłówek („location: member.php”); // przekierowanie   )) else ($ _SESSION ["ERRMSG"] \u003d "Nieprawidłowa nazwa użytkownika lub hasło"; // error session_write_close (); // zamknij sesję   nagłówek („lokalizacja: login.php”); // przekierowanie   exit (); )?\u003e

Utwórzmy stronę rejestracji, nazwijmy ją „register.php”. Wygląda jak strona logowania, ma tylko kilka pól i zamiast linku do rejestracji, link do login.php w przypadku, gdy użytkownik ma już konto.

Kod PHP

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

"; // początek tabeli foreach ($ _SESSION [„ ERRMSG ”] jako $ msg) ( // ustawia każdy błąd   $ err. \u003d " "; // zapisuje je do zmiennej   ) $ err. \u003d "
„. $ msg.”
"; // nie ustawiono końca tabeli ($ _SESSION [„ ERRMSG ”]); // zniszcz sesję } ?> Formularz rejestracyjny
Nazwa użytkownika
E-mail
Hasło
Powtórzenie hasła
Mam konto

Teraz utworzymy skrypt rejestracyjny w pliku „reg.php” Będzie zawierać „sql.php”, aby połączyć się z bazą danych. Ta sama funkcja jest używana jak w skrypcie logowania do czyszczenia pola wprowadzania. Zmienne są ustawione dla możliwych błędów. Dalej jest funkcja służąca do tworzenia unikalnego identyfikatora, który nigdy wcześniej nie został podany. Następnie dane są pobierane z formularza rejestracyjnego i weryfikowane. Sprawdza, czy adres e-mail ma poprawny format, a także czy hasło zostało ponownie wprowadzone. Następnie skrypt sprawdza, czy w bazie danych znajduje się użytkownik o tej samej nazwie i, jeśli taki istnieje, zgłasza błąd. I na koniec kod dodaje użytkownika do bazy danych.

Kod PHP

// początek sesji do pisania   funkcja Fix ($ str) (// wyczyść pola $ str \u003d @trim ($ str); if (get_magic_quotes_gpc ()) ($ str \u003d stripslashes ($ str);) zwraca mysql_real_escape_string($ str); ) $ errmsg \u003d array (); // tablica do przechowywania błędów   $ errflag \u003d false; // flaga błędu $ UID \u003d "12323543534523453451465685454"; // unikalny identyfikator $ nazwa użytkownika \u003d Poprawka ($ _ POST [„nazwa użytkownika”]); // nazwa użytkownika   $ email \u003d $ _POST [„email”]; // E-mail $ hasło \u003d Poprawka ($ _ POST [„hasło”]); // hasło $ rpassword \u003d Poprawka ($ _ POST [„rpassword”]); // ponowne hasło // sprawdź nazwę użytkownika   if ($ username \u003d\u003d "") ($ errmsg \u003d "Brak nazwy użytkownika"; // error $ errflag \u003d true; // podnieś flagę w przypadku błędu   ) // sprawdź E-mail, jeśli (! eregi ("^ [_ a-z0-9 -] + (\\. [_ a-z0-9 -] +) * @ + (\\. +) * (\\. (2,3 )) $ ", $ email)) (// musi pasować do formatu: [chroniony e-mailem]   $ errmsg \u003d "Niepoprawny e-mail"; // error $ errflag \u003d true; // podnieś flagę w przypadku błędu } // sprawdzenie hasła   if ($ hasło \u003d\u003d "") ($ errmsg \u003d "Brak hasła"; // error $ errflag \u003d true; // podnieś flagę w przypadku błędu } // sprawdź powtórkę hasła   if ($ rpassword \u003d\u003d "") ($ errmsg \u003d "Brak powtarzającego się hasła"; // error $ errflag \u003d true; // podnieś flagę w przypadku błędu } // sprawdzanie poprawności hasła if (strcmp ($ hasło, $ rpassword)! \u003d 0) ($ errmsg \u003d "Hasła się nie zgadzają"; // error $ errflag \u003d true; // podnieś flagę w przypadku błędu } // sprawdź, czy nazwa użytkownika jest darmowa   if ($ nazwa użytkownika! \u003d "") ($ qry \u003d "WYBIERZ * OD` użytkowników` GDZIE` Nazwa użytkownika` \u003d "$ nazwa użytkownika" "; // zapytanie MySQL $ wynik \u003d kwerenda_mysql ($ qry); if ($ wynik) (jeśli (mysql_num_rows ($ wynik)\u003e 0) ( // jeśli nazwa jest już w użyciu   $ errmsg \u003d "Nazwa użytkownika jest już w użyciu"; // komunikat o błędzie   $ errflag \u003d true; // podnieś flagę w przypadku błędu   ) mysql_free_result ($ wynik); ))) // jeśli dane nie zostały zweryfikowane, odsyła do formularza rejestracyjnego   if ($ errflag) ($ _SESSION [„ERRMSG”] \u003d \u200b\u200b$ errmsg; // komunikat o błędzie   session_write_close (); // zamknij sesję   nagłówek („location: register.php”); // przekierowanie   exit (); ) // dodaj dane do bazy danych   $ qry \u003d "INSERT INTO` userauth` .users` (` UID`, `Nazwa użytkownika`,` Email`, `Hasło`) WARTOŚCI (" $ UID "," $ nazwa użytkownika "," $ email "," ". md5 ($ hasło). "") "; $ wynik \u003d mysql_query ($ qry); // sprawdź, czy żądanie dodania powiodło się   if ($ wynik) (echo „Dziękujemy za rejestrację”. $ nazwa użytkownika. ”. Zaloguj się tutaj"; exit ();) else (die („ Błąd, skontaktuj się później ”);)?\u003e

Musisz także utworzyć skrypt, aby wylogować użytkownika. Kończy sesję dla użytkownika o podanym unikalnym identyfikatorze i nazwie, a następnie przekierowuje użytkownika na stronę logowania.

Kod PHP

Na koniec można użyć skryptu „auth.php”, aby strony były dostępne tylko dla upoważnionych użytkowników. Sprawdza dane logowania i, jeśli są poprawne, pozwala użytkownikowi przeglądać strony, a jeśli nie, prosi o zalogowanie. Ponadto, jeśli ktoś spróbuje zhakować witrynę, tworząc jedną z sesji, zostanie ona przerwana, jak w ogólnym przypadku.

Kod PHP

Jeden z warunków powyższego kodu jest przedmiotem pytania c.

Następujący kod musi zostać wstawiony na stronie dla autoryzowanych użytkowników, nazywa się na przykład „member.php” i możesz go nazwać jak tylko chcesz.

Kod PHP

    Masz dostęp do tej strony. Wyloguj się ( )

Uwierzytelnianie użytkownika gotowe!

DZWONEK

Są tacy, którzy czytają te wiadomości przed tobą.
Subskrybuj, aby otrzymywać świeże artykuły.
Email
Imię
Nazwisko
Jak chcesz przeczytać Dzwon
Bez spamu