Szukam linka do jakiegoś dobrego schematu rejestracji i logowania

0

Ma ktoś może takiego linka?
Wyszukałem w googlach parę takich stron ale wiele z nich prezentuje stary kod używający metod oznaczonych już jako deprecated i większość zawiera jakieś drobne błędy (np. brak obsługi sytuacji błędów, braku danych w zmiennych). Zaczynam dopiero działanie w PHP i analiza takiego kodu zawsze zabiera mi dużo czasu (większość funkcji jest dla mnie nowa). Jak bym dostał coś sprawdzonego to już mógłbym to modyfikować pod siebie i zaoszczędziłbym kupę czasu. Fajnie byłoby gdyby to był skrypt który przy rejestracji wysyła linka na adres email w celu potwierdzenia rejestracji.
Przeglądając takie skrypty (rejestracja, logowanie) spotkałem sie z opinią że przy użyciu session_register() i session_is_registered() nie powinienem korzystać z tablicy zmiennych $_SESSION. To prawda?

0

Przeglądając takie skrypty (rejestracja, logowanie) spotkałem sie z opinią że przy użyciu session_register() i session_is_registered() nie powinienem korzystać z tablicy zmiennych $_SESSION.

raczej, żeby W OGÓLE nie korzystać z session_register a zamiast tego używać tablicy superglobalnej $_SESSION, gdyż to pierwsze rozwiązanie jest już usunięte z PHP.

Polecić Ci mogę próbę analizy jakiegoś frameworka może? Takich typowych prostych "skryptów logowania" w których nie roi się od błędów i niedopatrzeń to chyba nie ma :(

PS: co to za załącznik? ;p

0

Załącznika nie miało być. Chyba jak ciągnąłem palcem po padzie to zaczepił się jakiś png i przeciągnął do okna tekstowego (już nie usunę tego).
To przynajmniej wiem czego się trzymać - tablic $_SESSION. Szkoda że tak ciężko znaleźć coś sprawdzonego na necie. Przeglądam już 7 szablon i może w końcu coś będzie ok.

0

Jak coś naskrobiesz - to wrzuć do oceny (do działu Oceny i Recenzje) - będzie prościej wskazać konkretne błędy niż wszystkie możliwe ;)

0

Czytam trochę o sesjach w PHP i mam taki cytat z e-booka:

//Mechanizm sesji był najważniejszą ze zmian oczekiwanych w PHP 4.
Umożliwia on przekazywanie parametrów między stronami w łatwy sposób.
Zmienne są przechowywane po stronie serwera a u klienta trzymane jest
tylko ID sesji. Te ID jest zapisane w cookie lub przekazywane przez URL.

PHP jest w stanie sam rozpoznać czy na komputerze klienta włączony jest
mechanizm cookies i w razie potrzeby dodać identyfikator sesji do
każdego URLu i formularza. Wymaga to jednak posiadania PHP
skompilowanego z opcją --enable-trans-sid.//

Próbuję znaleźć gdzie ustawia się ten parametr --enable-trans-sid żeby wiedzieć czy u mnie jest ustawiony i w pliku php.ini go nie ma.
Gdzie to sprawdzić?

0

--enable-trans-id to opcja jeżeli sam kompilujesz interpreter php ze źródeł. Ty tego na 100% nie robisz, więc ty zrób w php.ini ctrl+f i wpisz trans.
ALE.

NIE korzystaj z tego mechanizmu.
to jeden z dziwnych automagicznych ulepszaczy w php, które dają więcej złego niż dobrego (kradzież sesji)

jak ktoś nie akceptuje ciastek, no to ma problem, do którego już chyba przywykł. nie uszczęśliwiaj takich na siłę.

zresztą zobacz co jest napisane w php.ini na ten temat:

; trans sid support is disabled by default.
; Use of trans sid may risk your users security.
; Use this option with caution.
; - User may send URL contains active session ID
; to other person via. email/irc/etc.
; - URL that contains active session ID may be stored
; in publicly accessible computer.
; - User may access your site with the same session ID
; always using URL stored in browser's history or bookmarks.
; http://php.net/session.use-trans-sid
session.use_trans_sid = 0

0

Znalazłem i widzę że jest disabled. Zostawię tak. Dzięki.

0

A jak najlepiej konfigurować session auto-start:

; Initialize session on request startup.
; http://php.net/session.auto-start
session.auto_start=0
Zostawić na zero (wtedy będę chyba musiał wywoływać "session_start();")? Czy lepiej jest to włączyć i nie wywoływać metody "session_start();" w kodzie?

0

Na praktycznie żadnym serwerze nie ma ustawionego session auto start, więc bez sensu, żebyś się miał do tego mechanizmu przyzwyczajać, jak i tak będziesz musiał kod zmieniać na zdalnym serwerze, żeby ruszyło.

generalnie przy instalacji php masz bodajże php.ini-recommended i php.ini-development ? zapoznaj się z różnicami między nimi - w tym recommended zazwyczaj nie ma co ruszać i wszystko, co jest ustawione to jest ok // choć wiem, że ja zawsze coś grzebię, ale ze świadomością, że to mi potrzebne do pisania tej stronki, a nie uruchomienia jej potem

0

Ok. : )

0

Testuje taki prosty kod logujący i tworzący sesję i po zalogowaniu sprawdzam zmienną $_SESSION ale u mnie (w kodzie który ściągnąłem) w tej tablicy przechowywany są tylko dwie zmienne hasło i login. Czy nie powinien tam być ukryty jeszcze numer sesji php autoryzujący połączenie z serwerem (chyba nazywa sie PHPSESSID)?

0

numer sesji jest przesylany w ciastku. var_dump($_COOKIE);

0

Znalazłem to wreszcie ($_COOKIE - bez S).
A jakie sprawdzenie przeprowadzać dla weryfikacji zalogowanych użytkowników aby dopuścić ich do jakichś zastrzeżonych podstron? Np. Mam podstrony index_1.php, index_2.php i link do nich pojawiać sie będzie na głównej index.php dopiero po zalogowaniu użytkownika. Ale ktoś może chamsko wpisać w pasek adresu przeglądarki adres/inkex_2.php i wejdzie tam bez zabezpieczeń. Czy sprawdzenie pola loginu ze zmiennej $_SESSION jest wystarczające:

if(isset($_SESSION['login'])){ ładowanie strony} 
else {wyrzucenie do index.php}

?
Czy każda taka podstrona (index_1, index_2) powinna zaczynać sie od komendy:
session_start();
czy też sesja jest ciągnięta od strony index.php i nie trzeba jej na nowo wywoływać?

0

Sesja nie jest ciągnięta, plik powinieneś każdy zaczynać od session start.
To, co pokazałeś wyżej jest jak najbardziej ok.

Co jednak Ci powiem -> strony zazwyczaj projektuje się tak, że ZAWSZE wywoływany jest index.php - jeden, główny "starter", w którym startujesz sesje, przypisujesz zmienne (jakieś ścieżki), ładujesz odpowiednie biblioteki i klasy, następnie analizujesz adres strony (zmienne GET), na podstawie którego decydujesz który plik obsługujący podstronę załadować. W takim index.php możesz też wyświetlać nagłówek i stopkę strony - a o odpowiednią zawartość wyświetli odpowiedni już plik danej podstrony. (to taki wstęp do wzorca projektowego MVC)

0

Czyli jedna strona index.php a dodatkowe pliki php powinny być incudowane do kodu głównej strony a ich kod odpalany gdy jakieś warunki (if) są spełnione (czyli linki kliknięte przez użytkownika)?

Pytanie o zakończenie sesji przy wylogowywaniu.
Czy przy naciśnięci przez użytkownika przycisku wyloguj wystarczy że zostanie wywołana komenda "session_destroy();" w przeładowującej sie podstronie czy też należy dodatkowo wyczyścić załadowane wcześniej (przy logowaniu) zmienne $_SESSION['login'] i $_SESSION['password'] ?

0

session_destroy całkowicie niszczy sesje i użytkownik dostanie nowe ID sesji (pustej) po przejściu na kolejną podstronę (no bo będzie session_start)

0

Chciałbym pociągnąć jeszcze ten temat bo pisze teraz taki skrypt i mam zagwózdkę. Chodzi mi o to jak dana sesja jest zapamiętywana przez serwer i przeglądarkę. Mam taką sytuację że napisałem sobie taki podstawowy skrypt zalogowałem sie do strony na swoim serwerze, potem zamknąłem przeglądarkę a po je odpaleniu nadal byłem zalogowany. Potem zamknąłem przeglądarkę i wyłączyłem serwer apache a po włączeniu obu z nich nadal byłem zalogowany. Wynika z tego że te dane sesji są cały czas przechowywane. Ogólnie to chciałbym aby taki skrypt bardziej chronił użytkownika czyli po zamknięciu strony (przeglądarki) bez wylogowywania sesja była i tak niszczona aby nikt inny nie mógł na niej działać.

  1. Jak to zrobić?

Z drugiej strony chciałbym też umożliwić użytkownikom łatwy dostęp jeśli tak chcą. Chcę więc dodać przycisk przy logowani "Zapamiętaj mnie" (to co często proponują przeglądarki). Przycisk musiałby więc wyłączać powyższy algorytm który będzie niszczył sesję przy zamykaniu strony bez wylogowywania.

0

Sesja to po prostu ciastko z ID sesji. Ciastko to W TEORII jest tymczasowe (tzw. sesyjne) i powinno być usunięte po zamknięciu przeglądarki. tymczasem np. Chrome od jakiegoś momentu zauważyłem, że przestał to robić - ciastko jest stałe. Jest to zmniejszenie bezpieczeństwa, w zamian za wygodę, ale to już wina usera, że używa takiej, a nie innej przeglądarki.

PHP wszystkie dane z sesji trzyma w pliku z nazwą sesji, plik umieszczony jest w folderze skonfigurowanym w php w session.save_path. pliki te usuwane są w zależności od ustawień session.gc_* (przeczytaj sobie o wszystkich trzech ustawieniach). z tego co kojarzę PHP będzie miało problem z usuwaniem tego jeżeli użyjesz ini_set w pliku .php i takie sesje możliwe, że będą żyły już na zawsze (chyba, że sam sobie napiszesz "garbage collector" usuwający przestarzałe pliki). dlatego lepiej nie ruszaj session.save_path. restart serwera bodajże nic nie zmieni.

"zapamiętaj mnie" to ręczne zapisanie ciastka stałego (nie tymczasowego), w którym masz (niebezpieczne) zaszyfrowane jakoś login i hasło, albo po prostu własną sesję auto-logowania w bazie (i podajesz tylko jej ID w tym ciastku)

0

Ja testy robiłem na firefoxie (26) i właśnie tu zamknięcie przeglądarki nie przerywało sesji. Piszesz żeby nie grzebać przy session.save_path. A ustawienie czasu przeszłego dla ciasteczka (czytałem że jest parametr czasu oznaczający zniszczenie ciasteczka) może spowodować przy ponownym odpaleniu strony (przeglądarki) że użytkownik sie nie zaloguje? Chodzi mi o to że np. tuz po zalogowaniu ustawiany jest w ciasteczku czas na przeszłość, sesja chodzi i chodzi a po zamknięciu przeglądarki i ponownym czytaniu ciastka jest ono niszczone przez zły czas?
Szukałem trochę o tych stałych ciasteczkach aby zapewnić funkcję "Zapamiętaj mnie" (temat zupełnie nowy dla mnie). Znalazłem funkcję "setcookie($nazwa, $wartosc, $koniec, $sciezka, $domena, $bezpieczne);" Czy ona tworzy takie ciasteczko czy tez trzeba je wcześniej stworzyć a one je tylko modyfikuje według wskazań programisty?

0

setcookie tworzysz już i jednocześnie możesz zmodyfikowac istniejące już ciastko. Aby zrobić "Zapamietaj mnie" możesz przedłużyć ciastko na np. 7dni lub ile chcesz. (czas w sekundach podajesz). Jeżeli chcesz zniszczyć ciastko teraz - w tej chwili, to ustawiasz obecny czas, bez dodawania/odejmowania jakichś sekund. Jeśli ustawisz jakiś czas dla ciastka i zamkniesz przeglądarkę to ono dopiero wygaśnie po upłynieciu tego czasu, jesli chcesz aby niszczyło ciastko po zamknięciu przeglądarki to ustaw czas na 0

0

A ustawienie czasu przeszłego dla ciasteczka (czytałem że jest parametr czasu oznaczający zniszczenie ciasteczka) może spowodować przy ponownym odpaleniu strony (przeglądarki) że użytkownik sie nie zaloguje? Chodzi mi o to że np. tuz po zalogowaniu ustawiany jest w ciasteczku czas na przeszłość, sesja chodzi i chodzi a po zamknięciu przeglądarki i ponownym czytaniu ciastka jest ono niszczone przez zły czas?

Nie, to zniszczy ciastko natychmiastowo :P nie wiem też na ile można manipulować czasem ciastka sesyjnego.

co do pytań do setcookie - warto zapoznać się z manualem i materiałami w sieci - szkoda, żebym tu wszystko powtarzał, co zostało już zapisane

0

Potestuję ten czas ciasteczka. Dzięki.

0

Dodam moje 2 grosze:
Po co pisać logowanie samemu? Narażasz swój projekt na poważne luki bezpieczeństwa, bo jestem pewien że twoja implementacja nie będzie szczelna w 100%. Rozwiązanie: użyj OpenAuth jeśli piszesz w czystym PHP bez frameworka. Rozwiązanie nr. 2: jeśli piszesz w frameworku ( np. CI ) to wybierz ionauth. Testowany prze zemnie kilkukrotnie. Masz tam wszystko od logowania, rejestracje przez hashowanie z solą, możliwość tworzenia grup, logowania poprzez ciasteczka. Dodatkowo projekt jest cały czas rozwijany. Nic tylko skorzystać i spać spokojnie.

0

A że tak zapytam trochę z innej beczki. Czy po zalogowaniu do strony (u mnie forum) cała treść i poruszanie sie po forum powinna iść już przez protokół https ?
Bo widzę na innych forach że wcale tak nie jest i może nie jst to konieczne. Przecież super tajnych danych sie tu nie przesyła co?

0

jeżeli zrobisz samo logowanie przez https to zabezpieczysz jedynie login i hasło, ale potem i tak będzie się dało w określonej sieci przejąć sesję (i/lub przeczytać to, co leci do użytkownika, np. prywatne wiadomości). nie jest to nic nienormalnego, wszak 4p też działa bez https.
jeżeli jednak możesz korzystać z https i nie masz ku temu przeciwwskazań - korzystaj. problemem będą tylko ludzie wstawiający zawartość po http na Twojej stronie (np. obrazki) - wtedy bodajże przeglądarki lubią pluć się ostrzeżeniami dot. "nieszyfrowanej treści na szyfrowanej stronie". ale tu trzeba by było poszukać głębiej

0

Trochę próbuję pomanipulować zmienna $_COOKIE za pomocą setcookie() i nie bardzo mi wychodzi. Ogólnie jak robię sobie var_dump z podstawowej (tworzonej na samoistnie) zmiennej $_COOKIE to otrzymuje tablice o trochę dziwnych polach:

array(4) { ["bbff569fbf_data"]=> string(53) "a:2:{s:11:"autologinid";s:0:"";s:6:"userid";s:1:"2";}" ["bbff569fbf2hc3_c1"]=> string(1) "2" ["bbff569fbf_sid"]=> string(32) "b5d7aa12208cdfef8bbb8bb1a33de069" ["PHPSESSID"]=> string(26) "2cnop2um5patstn0l49t98ar11" } 

Jeżeli teraz poprzedzę ten var_dump poleceniem setcookie aby ustawić parę artości:

<?php
setcookie("mycookie", "", time() + 120);
 echo '<br />';
echo 'Zmienna $_COOKIE:  ';
echo '<br />';
 echo '<br />';
var_dump($_COOKIE);

to nic sie nie zmienia i wynika z tego że wywołana komenda w ogóle nie wpływa na zmienną $_COOKIE. Co robię źle?

0

setcookie wysyła ciastko do usera. w teorii. user go może nie przyjąć. tę wartość w COOKIE będziesz miał dopiero po następnym requeście od użytkownika, kiedy będziesz wiedział, że user przyjął ciasteczko i takie je odsyła. poczytaj dokładniej o tym jak działa mechanizm ciasteczek

0

Testowałem opcję z tym zwrotnym zapytaniem i nadal to samo.
Oto mój uproszczony kod w index.php:

 
<?php
setcookie("mycookie", "", time() + 120);
 echo '<br />';
echo 'Zmienna $_COOKIE:  ';
echo '<br />';
 echo '<br />';
var_dump($_COOKIE);
echo '<br />';  
   
require_once("baza.php");

// warunek zaciągający  kod logowania
if(isset($_GET)  && 
isset($_GET['var']) && 
$_GET['var']==1)    {
	require('login.php');
	} 
?>


<a href="index.php?var=1">Logowanie</a><br />
<a href="index.php">Strona główna</a>  


Początek strony login.php to:

<?php
require_once("baza.php");

if(isset($_SESSION['login'])){
header("Location: index.php");
}


echo 'Sprawdzenie $_SESSION';
echo '<br />';
var_dump($_SESSION);
echo '<br />';
echo 'Sprawdzenie $_COOKIE';
echo '<br />';
var_dump($_COOKIE);
echo '<br />';

 

Pomimo zastosowania metody "setcookie" na początku strony index.php i potem powrotowi do tej strony (po kliknięciu linka do logowania) zmienna $_COOKIE ma taką samą postać w kolejnych sprawdzenia var_dump. Coś jest nie tak. No a opis na http://pl1.php.net/manual/en/function.setcookie.php jest skąpy i nic nie wyjaśnia.

0

No a opis na http://pl1.php.net/manual/en/function.setcookie.php jest skąpy i nic nie wyjaśnia.

Manual na 5 ekranów FullHD, wyjaśnia Twój błąd, ale to trzeba przeczytać. CTRL+F i wpisz "pitfall", potem czytaj tę sekcję.

W pierwszym punkcie masz swój pierwszy błąd
W drugim punkcie masz swój drugi błąd (na który nie zwróciłem uwagi wcześniej, bo wczytałem się w opis, nie listing)
Poczytaj więc punkt trzeci, zanim napiszesz trzeci post

0

Widzę co jest źle- brak drugiego argumentu w funkcji setcookie(). Ale to akurat ściągnąłem z jakiegoś skryptu bo ta zmienna nie jest mi potrzebna. Teraz wszystko działa. Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1