Add to Google Reader or Homepage Prihlásiť sa k odberu RSS

| Rubrika Php / mysql

Diskusia k článku

Prihlasovanie uživateľa prostredníctvom $_SESSIONZobraziť článok

Matúš
Dátum a čas 16. 01. 2012, 11:25 E-mail m.novak274 [a] gmail.com

Zdravím. Začínam s PHP a potreboval by som pomoc. Vedel by niekto spraviť toto : Chcem sa prihlásiť ako admin, a ako jediný chcem pridávať a odoberať textové články. Pomohol by mi niekto ? Môžte ma kontaktovaj aj na mail. Prijmem každú radu. Ďakujem :)

sedg
Dátum a čas 05. 01. 2011, 18:57 E-mail dsfghdfs

dsfghfds

Vail
Dátum a čas 17. 08. 2010, 19:10

Vie mi niekto povedat preco mi session nepracuje na mozile a ie? na opere ano. Cookies zapnute vsade.

Pri pouzivani session som kapol na to ze to ci pracuju alebo nie zavisi od nastaveni v php.ini. Ci uz v programe tvoriacom virtualny server alebo na seriozne registrovanom hostingu a domene su tieto subori defaultne viac menej identicke. Vie niekto ako ponastavovat tie najzakladnejsie parametre aby to fachalo? Ma s tym niekto skusenosti? Na mojom virtualnom serveri som php.ini zmenil tak ze sa to nakoniec rozbehalo ale len ciastocne ako uz pisem... vdaka za rady ak to tu vobec niekt obude citat:)

Vail
Dátum a čas 16. 08. 2010, 14:18

Vdaka aj za tento clanok, nezdrzim sa ale mierne kritickeho komentraru, ktory sa nevstahuje len nan. Mas tu viacero peknych ukazok kodov, jasnych a zretelnych s dobrymi radami. Ale tiez viacero kodov a clankov, ktore len si len tazko aj mierne pokrocily vie predstavit hned v spravnom kontexte. K tomu su dost casto bez poriadkych komentarov ku kodu, pricom v nich mnohokrat pouzivas kadejake "ficuriny". Skuseny a ostrielany koder nepotrebuje citat tvoje clanky, a pre tych menej skusenych su niektore vyuzitelne tak na 95%. Ja len tolko, ze menej je castokrat viac... Mozno by boli potom aj diskusie zivsie. Takto sa z clanku dozviem len to co som uz vedel, teda ako sa to zhruba robi, a z diskusie uz vobec nic...

peto
Dátum a čas 30. 08. 2009, 16:15 E-mail ostavbe [a] gmail.com

Neviete niekto prepojit phpbbe3 a wordpress mu na urovni uzivatelov - spolocna registracia a session ?

masko
Dátum a čas 24. 06. 2009, 02:00

urcite pride na rad aj clanok o problematike bezpecnosti, hlavne tie zakladne problemy ako sql injection a xss treba mat zvladnute.

ixod
Dátum a čas 20. 06. 2009, 23:22 E-mail ixod11 [a] gmail.com

Tak som si pocital nejake info o session (aby som zistil co je to session fixation a hijacking) a niektori autori odporucaju este toto:
&& $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT'])
No a toto potom kontroluju na kazdej stranke spolocne aj s $_SESSION['logged']['Name'].
V kazdom pripade clanocek na prakticku ukazku ochrany proti tymto neduhom by som uvital + nieco o tokenoch.
Dakujem.

ixod
Dátum a čas 20. 06. 2009, 22:22 E-mail ixod11 [a] gmail.com

Jedna otazocka,
preco generujes novu session pomocou session_regenerate_id();,
ked potom do session tak ci tak
pridas meno z tabulky: $_SESSION['logged']['Name'] = $row['Name'];
Ja som si myslel, ze po uspesnom zisteni, ze uzivatel je v tabulke, tak do session pridam nahodne vygenerovany retazec (aby sa nedal uhadnut) a je to. Prosim o nejake vysvetlenie, dik.

Naspäť naspäť

Pridať komentár

Koľko je na ruke prstov?

Náhľad článku

Prihlasovanie uživateľa prostredníctvom $_SESSION

Predpokladom pre prihlasovanie užívateľov do klientskej časti webu je tabuľka, kde budú uložené dáta, pričom nevyhnutnou súčasťou je samozrejme prihlasovacie meno a heslo. Je dobré zapamätať si, že stĺpec tabuľky, ktorý využívame ako prihlasovacie menu by mal mať nad sebou index UNIQUE, ktorý zabezpečí, že v tabuľke nebudeme mať dvoch užívateľov s rovnakým prihlasovacím menom. Viac informácií o tejto problematike som už rozoberal v samostatnom článku, takže sa o tom nebudem viac rozpisovať.

Predpokladajme teda, že máme v MySQL databáze tabuľku s takouto štruktúrou.

Name Login Password ID
Fero fero hashhesla 1

Pochopiteľne v stĺpci password ukladáme heslá užívateľov v nejakom aspoň minimálne šifrovanom formáte :-). (md5 / sha1).

Ideálne je celý prihlasovací engine zabaliť do nejakej triedy, ktorú si incializujeme hneď v úvode index.php. Mám zabehnutú takúto štruktúru.

<?
 
class login_management {
 
   public function loginUser() { }
   public function logoutUser() { }
   public function checkUser() { }
 
}
 
?>

Myslím, že úlohy jednotlivých metód sú jasné z ich názvov. Snáď len toľko, že metóda checkUser() je uvádzaná v každom súbore, resp. v súbore index.php, ak predpokladáme, že to je hlavný súbor, do ktorého sú includované podstránky, na základe napr. URL adresy. Táto metóda skontroluje či je užívateľ prihlásený alebo nie, prípadne ak sa užívateľ pokúša vstúpiť na chránenú podstránku, presmeruje ho na chybovú hlášku – v prípade, že nie je prihlásený.
Poďme teraz k samotnému obsahu metód.

Metóda loginUser()

Metóda slúži na prihlásenie užívateľa – overenie zadaného mena a hesla s menom a heslom uloženým v tabuľke + nastavenie $_SESSION.

<?
 
public function loginUser($login,$password) {
 
    // ošetrenie vstupov, vygenerovanie md5 hashu
    $password = md5($this->safeInput($password));
    $login = $this->safeInput($login);
 
    // SQL dotaz
    $sql_user = "
        SELECT
           SQL_CALC_FOUND_ROWS *
        FROM
           table
        WHERE
           login LIKE '" . $login . "'
        AND
           password LIKE '" . $password . "'
        LIMIT 1";
 
        $query = mysql_query($sql_user);
 
   // zistenie počtu nájdených riadkov
   $count = mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0);
 
   // ak je väčší než nula, prihlásenie je úspešné
   if($count>0) {
 
      $row = mysql_fetch_assoc($query);
 
      // inicializujeme v superglobálnom poli pole 'logged', v ktorom su uložené ďalšie údaje o prihlásenom užívateľovi.
      // pole záloveň slúži ako identifikátor prihlásenia / neprihlásenia.
      $_SESSION['logged'] = array();
 
      // pregenerovanie ID session, brani, tzv. session fixation
      session_regenerate_id();
 
      // nastavime vsetky potrebne udaje o uzivatelovi z tabulky do $_SESSION.
      $_SESSION['logged']['Name'] = $row['Name'];
 
      // unixový timestamp (počet sekúnd od r. 1970)
      // zaznamenávame si čas prihlásenia, ktorý neskôr kontrolujeme a aktualizujeme pri každej aktivite
      $_SESSION['logged']['timestamp'] = time();
 
      header("Location: http://presmerujeme_kamkolvek");
      exit;
 
   // počet riadkov bol rovný nule, takže prihlásenie nebolo úspešné
   } else {
 
      header("Location: http://presmerujeme_kamkolvek");
      exit();
 
   }
 
}
 
?>

Po vykonaní tejto metódy máme užívateľa prihláseného (za predpokladu, že zadal meno a heslo aké mal…). Jeho prihlásenie overujeme podmienkou existencie poľa $_SESSION[‚log­ged‘]:

<?
 
if(is_array($_SESSION['logged'])) { ... }
 
?>

Metóda checkUser()

V tejto metóde kontrolujeme, či je užívateľ prihlásený alebo nie a zároveň aktualizujeme timestamp. Číslo 1800 v podmienkach znamená, koľko sekúnd môže byť užívateľ neaktívny. Pokiaľ bude neaktívny dlhšie, bude automaticky odhlásený. Metóda je volaná na každej podstránke.

<?
 
   public function checkUser() {
 
      // užívateľ je prihlásený, ale zároveň, čas poslednej aktivity mínus aktuálny čas
      // je menší než povolený limit nečinnosti (1800 s = 30 min.)
      if (isset($_SESSION['logged']['timestamp']) && ($_SESSION['logged']['timestamp'] < time()-1800)) {
 
         // užívateľa odhlásime
         $this->logoutUser();
         return false;
 
      // užívateľ je prihlásený, funkcia vracia true
      } elseif(isset($_SESSION['logged']['timestamp'])) {
 
         $_SESSION['logged']['timestamp'] = time();
 
         return true;
 
      }
 
   }
 
?>

Poslednou nutnou metódou je metóda zabezpečujúca odhlasovanie. Je veľmi jednoduchá, založená na funkcii unset() alebo session_destro­y(). Pokiaľ použijeme session_destro­y(), zahodíme VŠETKY nastavené $_SESSION, takže je to na zamyslenie – či ich po odhlásení potrebujeme alebo nie.

<?
public function logoutUser() {
 
    session_destroy();
 
    // alebo
    // unset($_SESSION['logged']);
 
    header("Location: niekam_presmerujeme");
    exit;
 
}
?>

Na záver snáď len toľko, že tu načrtnuté metódy sú len kostrou prihlasovacej triedy, na ktorú sa dajú nabaľovať mnohé prvky.

RSS