logowanie z funkcją 'zapamiętaj mnie'

logowanie z funkcją 'zapamiętaj mnie'
0

cześć,
mam pytanie, w jaki sposób powinienem rozwiązać problem, gdy podczas logowania użytkownik zaznaczy opcje 'zapamiętaj mnie'.
wiem, że będzie potrzebne ciastko, tylko co powinno być w tym ciastku zawarte, żeby system był dosyć bezpieczny?
https://paragonie.com/blog/2015/04/secure-authentication-php-with-long-term-persistence#title.2 tu znalazłem jakiś pomysł, ale nie do końca go rozumiem, w takim razie czy ktoś mógłby mi wytłumaczyć jak to powinno wyglądać?
z góry dziękuję

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
1
  1. logujesz uzytkownika, generujesz sobie długi, losowy string (czyli NIE md5(time()) czy uniqid() tylko coś bezpiecznego np. openssl_random_pseudo_bytes) - dalej nazwijmy to token logowania
  2. zapisujesz do bazy, że ten token oznacza logowanie tego użytkownika
  3. w ciasteczku zapisujesz token
  4. potem po prostu porównujesz dane z ciastka z tym co masz w bazie

ten sposób pozwala na zapamiętanie użytkownika, nie wymaga zapisania w ciastku ani loginu, ani tym bardziej hasła czy jego hashu (co się widuje czasem), dodatkowo możesz dobudować do tego inne mechanizmy, np. weryfikacja czy bieżące ip zgadza się z zapisanym razem z tokenem ip, możesz też łatwo wymusić wylogowanie użytkownika, bo po prostu kasujesz token z bazy


0

czyli wystarczy, że zapamiętam jedną zmienna (losowo wygenerowana, oczywiście odpowiednio długą, ale JEDNĄ zmienna) w ciastku i szukam jej w bazie, a jeżeli pasuje to loguje użytkownika? i to koniec?

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:1788
0

Tak, natomiast dobrze jest sprawdzać jeszcze IP, albo coś. Zwiększysz w ten sposób bezpieczeńśtwo.

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
1

@Desu: Większość serwisów nie sprawdza IP, bo ludzie ze zmiennym IP mieliby problem. Ja bym raczej pomyślał o zerowaniu sesji jeżeli drastycznie zmienił się User Agent (np. z Firefoxa na Chrome, podbicie wersji nie - nikt ciastek nie przenosi, więc sugeruje to kradzież sesji) albo drastycznie zmienił się IP (czyli zmiana z 188.1.100.100 na 188.1.200.200 nie jest problemem, bo to w obrębie typowego zmiennego IP się mieści, ale na 91.251.100.100 już tak).


0

przy kazdym zalogowaniu powinienem od nowa generowac token i umieszczac go w ciastku uzytkownika?

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
0

jak nie dostaniesz żadnego tokena, a dostaniesz dane logowania to tak, twórz nowy - rozróżnisz sobie wtedy dwie sesje (np. z telefonu i komputera)


0

to teraz mi trochę namotałeś... jak wygeneruję od nowa token to stary będzie nieaktywny, czyli jak ktoś zaloguje się na telefonie to token zapisany na komputerze przepadnie czy coś nie tak myślę?
w dodatku jak sprawdzać i porównywać user agenta? tzn. które dane w user agencie są istotne, a które nie? logując się na telefonie user agent będzie zupełnie inny, prawda? już się pogubiłem

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
0

weryfikacje user agenta na razie sobie odpusc

a tokeny nie zapisuj w tabeli z uzytkownikiem, tylko osobno, dwie kolumny wystarczją: id_user, token


0

no dobra, to w takim przykład:

  1. ktoś loguje się na komputerze ustawiam mu token: 1 i jest zalogowany
  2. ta sama osoba loguje się na telefonie ustawiam jej nowy token: 2 i jest zalogowany

teraz jak wchodzi na komputerze to jest wylogowany bo token jest nieprawidłowy. czy dalej coś mylę?

Tumeg
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:687
0

Możesz zrobić też żeby logowanie było zapamiętane na wielu urządzeniach (do tabeli z tokenami dodajesz kolejne, powiązane z id usera).

0

to ma sens :) dzieki

0

mam problem z odczytaniem umieszczonego wcześniej openssl_random_pseudo_bytes w bazie danych...
Notice: Trying to get property of non-object in D:\xampp\htdocs\projekt\funkcje\logowanie.php on line 18
dostaje taki błąd

w bazie danych kolumna przetrzymująca dane jest typu varbinary
próbowałem dodawać/odczytywać ciągi z funkcją mysql_real_escape_string i bez tego i dalej nic
rekord normalnie dodaje się do bazy, ale podczas sprawdzania czy token z ciastka jest taki sam jak w bazie dostaje ten błąd...

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
0

wrzuć kod, nie będziemy zgadywać


0
Kopiuj
if (!isset($_SESSION['log']['uzytkownik']) && isset($_COOKIE['tunes_token'])) {
		$token = $_COOKIE['tunes_token'];

		$bd = polacz_bd();

		$query = $bd->query("select uzytkownik from uzytkownik_pamietaj where token='".$token."'");

		if (!$query) {
			wystapil_blad();
		}

		if ($query->num_rows==1) {
			$dane=$query->fetch_object(); // fetch_row(); taki sam efekt daje
			$_SESSION['log']['uzytkownik'] = $dane[0];
			$_SESSION['log']['pamietaj'] = 1;
		} else {
			setcookie('tunes_token', $_COOKIE['tunes_token'], time()-1);
		}
	}

i w razie potrzeby dodawanie tokenu do bazy

Kopiuj
if ($zalogowanie==1) {
			if (isset($_POST['log_pamietaj']) && $_POST['log_pamietaj']=='tak') {
				$bd = polacz_bd();

				$tokenok=0;
				while ($tokenok==0) {
					$token = openssl_random_pseudo_bytes(50);

					$query = $bd->query("select * from uzytkownik_pamietaj where token = '".$token."'");
					if (!$query) {
						wystapil_blad();
					}

					if ($query->num_rows > 0) {
						$tokenok=0;
					} else {
						$tokenok=1;
					}
				}
				
				$query = $bd->query("insert into uzytkownik_pamietaj values('".$log_login."', '".$token."')");
				if (!$query) {
					wystapil_blad();
				}

				//dodaje ciastko jak wszystko ok i wrzucone juz do bazy danych 
				setcookie("tunes_token", "'".$token."'", NULL, NULL, NULL, NULL, TRUE);
			}
dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
0

no to jeszcze pokaż która to linijka jest u Ciebie 18 w logowanie.php


0

Notice: Trying to get property of non-object in D:\xampp\htdocs\projekt\funkcje\logowanie.php on line 18

Kopiuj
if ($query->num_rows==1) {
  • sprawdzanie tokena

Notice: Trying to get property of non-object in D:\xampp\htdocs\projekt\funkcje\logowanie.php on line 130

Kopiuj
if ($query->num_rows > 0) {
  • dodawanie tokena do bazy
dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
0

a co masz w wystapil_blad? jeżeli nie kończysz skryptu przez die/exit no to sam popatrz

Kopiuj
                    if (!$query) {
                        wystapil_blad();
                        // $query jest false
                    }
                    
                    // tu nie ma else, więc może się zdarzyć, że w tym miejscu $query jest false
                    // próbujesz się odwołać do false->num_rows
                    if ($query->num_rows > 0) {
                        $tokenok=0;
                    }

ale z drugiej strony - wystapil_blad zakładam, że pokazuje Ci, że jest jakiś błąd - i chyba tego nie przeoczyłeś?


0

ok masz racje, co nie zmienia faktu, że jakimś cudem query jest false, a więc select uzytkownik from uzytkownik_pamietaj where token='".$token."' nie zwraca zadnego rekordu, a co się z tym wiąże token dodany chwilę wcześniej do ciastka po sprawdzeniu go z tokenem z bazy danych nie pasuje, a jak dam echo $token to wyskakują mi bardzo dziwne znaczki, a w bazie danych wygląda normalnie, może jakoś inaczej powinienem go zapisywać/wczytywać? bo myślę, że jak zmienię openssl_random_pseudo_bytes na inną funkcję generującą losowy ciąg znaków, ale używającą normalnych znaków to wszystko będzie działać

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:12 dni
  • Lokalizacja:Rzeszów
0

Potraktuj to jeszcze jakimś sha-1 albo md5, żeby uzyskać tylko alfanumeryczne znaki

swoją drogą aż prosisz się o sql injection (poważna dziura), nie powinieneś tak robić zapytań. ogarnij temat PDO i bindowania zmiannych.

no i jakąś sensowną obsługę błędów zrób (tutaj nawet nie pokazujesz sobie widzę komunikatu zwracanego przez mysql o błędzie)


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)