ugrás a tartalomhoz

PHP MySQL bejelentkezés

gabbor · 2015. Nov. 27. (P), 17.23
Sziasztok!

Szeretnék egy a Facebook-hoz hasonló beléptető rendszert. E-mail cím, jelszó, check button a bejelentkezés megjegyzéséhez és egy submit button, vagyis egy egyszerű HTML form.

PHP oldalról nem tudom hogyan kezdjek neki. MySQL táblában vannak tárolva az e-mail cím+jelszó párosok, hogy hogyan védve, az most mindegy.

Ha a bejelentkezés megjegyzését bepipálják, akkor $_COOKIE tömbre lesz szükségem, ha nem pipálják be, akkor $_SESSION. Legalábbis, így gondolom, de javítsatok ki ha tévedek vagy jobb csak $_COOKIE tömböt használni.

COOKIE-ba mit tároljak? E-mail és jelszó párost vagy valami karakterláncot amit mondjuk MySQL táblában tárolok ami kapcsolatban állna az illető bejelentkezéséhez szükséges e-mail címével és egyéb adataival?

Hogyan valósítanátok meg egy bejelentkező felületet ami képes kiírni, hogy ki mikor milyen gépről volt bejelentkezve? Tehát pl ha belépek mobilról, tabletről meg mondjuk két PC-ről, akkor ezeket írja ki és lehetőség legyen arra, hogy mondjuk a tablet-es és a mobilos bejelentkezéseket egy adminon megszakíthassam. Meg pl kiírja eseményszerűen, hogy mikor melyik gépről volt bejelentkezve, hányszor, mikor lépett be utoljára, mikor kapcsolták le admin felületen a bejelentkezését, ha lekapcsolták az adott eszközökről, stb. Persze a legfontosabb az aktív bejelentkezések, hogy meg lehessen őket szakítani, de azért a naplózás se mindegy, hogy visszatudjam nézni mikor mi történt eseményszerűen. Érdemes ehhez a SESSION-öket már MySQL táblában tárolni session_set_save_handler () vagy még jó a hagyományos default fájl-alapú is?

Rohanok munkába, sorry a kissé értelmetlenre sikeredett megfogalmazásaimért. Nem kell kész forráskód, se linkek, csak egy rövid magyarázat, hogyan a legésszerűbb, leglogikusabb ezt megvalósítani.

CMS, framework, stb-t, nem szeretnék használni csak natív PHP-t és MySQLi-t.
 
1

Hát ha bejelentkezve maradást

erik0415 · 2015. Nov. 27. (P), 19.55
Hát ha bejelentkezve maradást akarsz csinálni, és cookie-ba tárolni az adatok semmiképpen se tárolj benne felhasználónevet és jelszót! Inkább generálj egy változó, vagy fix (de ez kevésbé biztonságos) karakterláncot amit tárolsz mysql-be és azt tárold a cookie-ba (a változót, arra kell érteni, hogy pl. ha belépsz egy másik eszközről, akkor generáljon újat). A rendszeredet mindenképp session-re építsd. Tehát ha cookie-s bejelentkezést is használtak, akkor csak nézd meg, hogy van-e és ha van, akkor ellenőrizd és ha rendbe van, akkor add meg a session-nek a megfelelő értéket. A megszakítást úgy oldanám meg, hogy amikor megakarod szakítani az adott felhasználó bejelentkezését, akkor megváltoztatnám azt a random generált karakterláncot amit használsz sessionbe/cookiba. A logolást azt úgy oldod meg ahogy akarod kb ahhoz nem tudok mit mondani. A többit meg te tudod megoldani, de azokat már magadnak kell kitalálni, mert azt már csak lekódolva tudnám prezentálni :)
2

Bocs, hogy belekérdezek,

smokey · 2015. Nov. 27. (P), 22.59
Bocs, hogy belekérdezek, érdekes a téma, és szemet szúrt egy mondta az írásodban:

A megszakítást úgy oldanám meg, hogy amikor megakarod szakítani az adott felhasználó bejelentkezését, akkor megváltoztatnám azt a random generált karakterláncot amit használsz sessionbe/cookiba


Ez alatt pontosan mit értesz? Itt ki változtat meg mit? Ha jól tudom, akkor PHP-ben lehet más sessionjében turkálni, de nem szerencsés.

Én egyébként a loggolást és a kijelentkeztetést is egy adatbázis táblával oldanám meg.

1. Minden belépéskor letárolnám a session adatatit: ki, mikor, miről és milyen session ID-val (vagy a session-ben ÉS az adatbázisban is tárolt random generált kulccsal) lépett be. Ebbe a táblába felvennék még egy status mezőt és akár egy last_activity_timestamp mezőt is.

2. Minden kérésnél megvizsgálnám, hogy egy a sessionben tárolt random ID-hoz tartozik-e adatbázis rekord: ha igen, akkor engedném tovább, ha nem, akkor kidobnám a user-t a sessionből.

3. Ha egy admin felületen keresztül egy usert valamelyik sessionjéből ki szeretnék dobni, akkor a megfelelő adatbázis rekordban állítanám a status mezőt, illetve a randm generált ID-t NULL-ra (ezen a ponton hivatkoznék az előző pontra, ez egy lehetséges megoldás a kijelentkeztetésre; ha az adatbázisban egy session random kulcsa NULL, akkor a felhasználó session-jében tárolt random kulcs alapján már nem lesz létező rekord, így a második pont alapján a felhasználót kijelentkeztettük). Szerintem fontos volna lekezelni még két esetet: felhasználó általi kijelentkezés, session lejárat (ezért lehet később hasznos a last_activity_timestamp).

4. Ha adott eszközön a felhasználó megnyomja a kijelentkezés gombot, akkor a session-höz tartozó rekord status-át, last_activity_timestamp-jét és a random generált kulcsát is módosítanám (a kulcs mezőt simán NULL-ra állítanám). Ebben az esetben a last_activity_timestamp a session zárását mutatná. Bejelentkezés dátum megvan, kijelentkezés dátum megvan, teljes a log.

5. A lejárt session-ben már nem található meg a random generált kulcs, ezért hivatkozni session lejárat után egy a random kulcsot tartalmazó mezőre már nem lehetséges, viszont a last_activity_timestamp itt jól jöhet. Készítenék egy scriptet, ami figyelné a rekordokat a táblában, és ha talál olyan rekordot, ahol a random kulcs nem NULL, a status állapota is megfelelő, viszont a last_activity_timestamp bizonyos (akár általad meghatározott) ideje (kvázi rég) történt (ez felhasználó inaktivitást mutat), akkor ezt a session-t is kijelentkeztetném a 2. pontban megírt metódus segítségével.

A loggolás és a kijelentkeztetés a fentihez hasonló módon szerintem jól tud működni. A felhasználó megjegyzéssel is kompatibilis lehet a dolog, érdemes bekötni ugyanebbe a táblába szerintem, hiszen mindegyik eszközről indított session más, az eszközhöz tartozó "Maradjak bejelentkezve" kóddal bír.

Arra mindenkép figyelnék, hogy a random generált kulcsok NULL értékűek legyenek egy nem aktív session esetében (biztos, ami biztos), illetve arra is, hogy ne legyen ütközés, értem ezalatt, hogy legalább egy időben kétszer ugyanaz a random generált kulcs ne szerepeljen az adatbázisban.
3

Ez alatt pontosan mit értesz?

erik0415 · 2015. Nov. 28. (Szo), 13.17
Ez alatt pontosan mit értesz? Itt ki változtat meg mit? Ha jól tudom, akkor PHP-ben lehet más sessionjében turkálni, de nem szerencsés.


Én úgy értettem, mint ahogy te leírtad kb. Feltételeztem az alap, hogy minden oldal frissítésnél a rendszer ellenőrzi, hogy az adott session érvényes-e, és ha nem akkor kidobja a felhasználót. Én nem a felhasználó session-ét akartam módosíttatni, hanem a mysql adatbázisba eltárolt karakterláncot. És ha azt változtatja, vagy a te esetedbe NULL-ra állítja, akkor az oldal betöltésnél kidobja a felhasználót érvénytelen session miatt.