Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zabezpieczenie Cookies po zalogowaniu
Forum PHP.pl > Forum > Przedszkole
Soulast
Jest bardzo kiepski w zabezpieczeniach ale osoba która to napisała najwidoczniej jeszcze bardziej niż ja.

Obecnie skrypt który posiadam ustawia cookies po zalogowaniu w następujący sposób:

  1. //Set Cookies
  2. setcookie('tid', $user['id'], time() + (60 * $login['clength']));
  3. setcookie('user', $nazwa['user'], time() + (60 * $login['clength']));
  4. setcookie('pass', $haslo['pass'], time() + (60 * $login['clength']));


Gdzie Cookies w debugu wygląda następująco:

  1. Array ( [tid] => 1 [user] => nazwa [pass] => haslo [PHPSESSID] => idsesji )


Problem w tym że wystarczy abym zmienił swoje ID w cookie na jakiegoś innego usera ID i mam pełny dostęp do jego danych.

Podaje przykład obecnego działania zabezpieczenia if (isset($_COOKIE["user"]))

  1. if (isset($_COOKIE["user"])){
  2. $member=mysql_query("SELECT * FROM members WHERE id='{$_COOKIE['tid']}' AND password='{$_COOKIE['pass']}'");
  3. $member=mysql_fetch_array($member);
  4.  
  5. <div align='center'>
  6. .......Notka Po zalogowaniu ID usera 1 ...........
  7. </div>";
  8. }else{
  9. <div align='center' >
  10. ............Jakiś Login Form........
  11. </div>";}


Próbowałem jeszcze aby również sprawdzano hasło w sposób typu :

  1. if ((isset($_COOKIE["user"])) && (isset($_COOKIE["pass"])))


Niestety bez rezultatu...Mogę na stronce manipulować w cookies każdym ID usera i przez to mieszać im w profilach bez problemowo.
Ale niestety nie potrafię zabezpieczyć się przed tym aby nikt inny tego w tak prosty sposób robił.

Za wszelkie sugestie oraz pomoc z góry dziękuje.
wookieb
SESJA jest odpowiedzią na wszystko.
Soulast
Czyli?
Zastąpienie kompletnie cookies sesją?czy może się da jakoś sesje dodać do powyższego kodu?
wookieb
Zastąpienie cookies sesją. I nie musisz w niej przechowywać loginu i hasła użytkownika a jedynie jego ID.
Mikz
  1. $member=mysql_query("SELECT * FROM members WHERE id='{$_COOKIE['tid']}' AND password='{$_COOKIE['pass']}'");


A teraz zrób sobie backupa bazy, otwórz cookies przeglądarki i ustaw sobie następującą wartość 'tid':

Cytat
'; UPDATE `members` SET `password` = 'nie umiem zabezpieczyć swoich skryptów' WHERE 1 = 1; --


A potem poczytaj do czego służy funkcja mysql_real_escape_string() i naucz się jej używać!
Soulast
Nie wiem czemu ale sporo pomocników w przedszkolu łapie agresje i rzuca klockami winksmiley.jpg

Zanim hasło oraz tid zostało wrzucone do cookies przemieliłem to przez md5 oraz obecnie użyłem funkcji or die() co daje dobry rezultat jak i randomową wartość sid również zakodowaną.W skrócie mówiąc jeśli id, sid, pass, name które znajdują się w cookies nie będzie równe tym co są w cookies funkcja automatycznie wylogowuje takiego usera.

Również dodałem kod zabezpieczający przed atakami z pod url ale to już inna bajka.

Anyway sprawę rozwiązałem więc proszę o zamknięcie posta czy tam jego usunięcie.
d.stp
Witam, zrobiłem logowanie na ciachach i mam identyczny problem jak w tym temacie dlatego postanowiłem tutaj odgrzać...

Jak to zabezpieczyć? chce mieć "zapamiętaj mnie" przy logowaniu, gdzie wtedy w cookiesa wrzucam czas ciacha na 24h i sprawdzam sobie np. w sekcji dla zalogowanych:

if (isset($cookie)) { // dla zalogowanego } else { // niezalogowany }

czy takie coś jest ok? w ciachu trzymam tylko login usera i wartość zalogowany_user 1 lub 0 jeśli niezalogowany.
nospor
Cytat
w ciachu trzymam tylko login usera i wartość zalogowany_user 1 lub 0 jeśli niezalogowany.

No przeciez kazdy moze bez problemu ustawic sobie takie ciacho i oh ech bedzie widzial tresc dla zalogowanego usera.... Czemu nie zrobisz tego normalnie na sesjach tylko kombinujesz bez sensu?
d.stp
Bo chce mieć sesje na jeden dzień, a nie że co zamknięcie przeglądarki musze się znowu logować...
nospor
No to zamiast trzymac login usera, trzymaj jakis tajny ciag wygenerowany dla danego usera i z jego IP i z czasem i zapisuj to do bazy oraz ustawiaj w ciachu. Gdy koles wejdzie z takim ciachem to sprawdzasz jaki user ma w bazie taki tajny ciag. Bedzie to o niebo bezpieczniejsze od tego co masz teraz

ps: cos takiego
$tajnyCiag = md5($userId . $userIp . $userBrowser . time());

gdzie $userIp i $userBrowser wyciagniesz z $_SERVER

ps2: zeby bylo jeszcze bezpieczniej to ustaw waznosc dla tego na 1 dzien. W bazie rzecz jasna a nie w ciachu

ps3: mozesz tez trzymac info z jakiego IP zostal utworzony ten tajny ciag i sprawdzac rowniez czy IP osoby z tym ciachem zgadza sie z IP zapisanym w bazie. Wowczas nawet jak haker wykranie to ciacho, to nie bedzie sie zgadzalo IP
d.stp
Dobra czyli przy logowaniu ustawiam sobie:

$tajny_ciag = md5('n'.time().'o'.time().'s'.time().'p'.time().'o'.time().'r');
setcookie('tajny_ciag ', $tajny_ciag, time()+3600*24);
// update ciacho where user = user_login

i gra gitara. Teraz gdzieś w indexie wrzucam:

  1. if (isset($cookie)) {
  2. // pobieram cookie z bazy
  3. // sprawdzam czy ciacho sie zgadza te z bazy == te w coookie
  4. // jesli jest ok wyswietlam sekcje dla zalogowanego
  5. // jesli nie jest ok wyrzucam go na strone logowania
  6. }


jak w bazie mam ustawić ważność? ohmy.gif
redeemer
Taki mechanizm ma swoją nazwę/nazwy: "Persistent login", "Remember me"

https://paragonie.com/blog/2015/04/secure-a...erm-persistence
nospor
Cytat
jak w bazie mam ustawić ważność?

Dodaj poprostu kolejne pole z data utworzenia tego tajnego ciagu i sprawdzaj czy nie jest starsze niz jeden dzien.
Tak samo utworz dodatkowe pole IP z ktorego utworzono ten tajny ciag.
d.stp
OK, czyli jak się zaloguje ponownie już na tym tajnym_ciagu ALBO odświeże strone jak jestem zalogowany to robie jeszcze update waznosc_tajnego_ciagu = nowa_waznosc. O to chodzi?

Tajny ciąg to moge zrobić tak jak hasła? solą itp??
nospor
Tak i tak.

A jako sol to rownie dobrze beda sluzyc dane user jak IP, browser czy time co ci podalem.
d.stp
No ale prawda jest taka że jakbym dał dał 12381723812371237 stringa to i tak to nie jest bezpieczne gdyż ponieważ uważam iż, że skoro ktoś przejmie takie ciacho to i tak sie zaloguje, a wprowadzanie IP tylko uprzykrzy życie bo wiele osób ma zmienne IP więc z tego będą problemy wink.gif
!*!
@d.stp nikt dziś nie buduje mechanizmów sesji opartych o IP, @nospor najwyraźniej ma sentyment do lat 90tych wink.gif skorzystaj z jakichś gotowych skryptów sesji lub klas frameworków. Przechwycenie takiego ciacha jest... kurde, musiałbyś mieć spore braki w filtrowaniu zmiennych przesyłanych od użytkownika, żeby wstrzyknąć kod który odczyta taki klucz należący do innego użytkownika
nospor
Cytat
@nospor najwyraźniej ma sentyment do lat 90tych

tongue.gif

Starzy ludzie maja swoje przyzwyczajenia wink.gif
Pyton_000
Stary człowiek i może biggrin.gif
nospor
I to nie jest mechanizm sesji a mechanizm "Remember me " wink.gif

@Pyton Stary czlowiek tez moze wink.gif

Cytat
wprowadzanie IP tylko uprzykrzy życie bo wiele osób ma zmienne IP więc z tego będą problem
to zamiast IP wprowadz BROWSER. zawsze to cos

Cytat
kurde, musiałbyś mieć spore braki w filtrowaniu zmiennych przesyłanych od użytkownika, żeby wstrzyknąć kod który odczyta taki klucz należący do innego użytkownika
Tja.... Nasz bohater w ciachu na poczatku trzymal login usera wiec wiesz wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.