Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Logowanie na sesjach
Forum PHP.pl > Forum > Przedszkole
mASTEreq
Witam, pilnie potrzebuję pomocy. Robię vortal komputerowy, zrobiłem już cms'a brakuje tylko logowania i zabezpieczenia panelu administratora... Wpadłem na pomysł, żeby konta załozone na forum działały w serwisie, czyli logowanie ma korzystac z bazy forum.
problem jest nastepujący. Stworzywszy sesje efekt widoczny jest tylko na stronie index.php?id=pole... Zamieszcze fragmenty kodu.
cms/rangi/login.php
Ta podstrona jest includowana w polu przeznaczonym na logowanie, albo jeżeli jest juz ktoś zalogowany to do bajerów profilu... (admin.php, modek.php czy user.php)
Kod
<?php
if (isset($_SESSION['admin']) && $_SESSION['admin']=='123') {
include('cms/rangi/admin.php');
                                 }
else if (isset($_SESSION['user']) && $_SESSION['user']=='abc') {
include('cms/rangi/user.php');
                               }
else {
?>
<table cellpadding="0" cellspacing="0" align="center">
<form name="login" method="POST" action="index.php?id=pole">
<tr><td><input type="text" class="log" name="login" value="login" onFocus="if(this.value=='login') {this.value='';}" onBlur="if(this.value=='') {this.value='login';}"></td><td rowspan="3" width="2"></td><td rowspan="3"><input type="image" SRC="_img/ikony//ok.png" ALT="OK"></td></tr>
<tr><td height="6"></td></tr>
<tr><td><input type="password" class="log" name="pass" value="haslo" onFocus="if(this.value=='haslo') {this.value='';}" onBlur="if(this.value=='') {this.value='haslo';}"></td></tr>
<tr><td colspan="3" height="3"></td></tr>
<tr><td colspan="3"><a href="#" class="srodek">Rejestracja w Portalu</a>
<a href="#" class="srodek">Przypomnienie hasła</a></td></tr>
</form>
</table>
<?php
}
?>

Jeszcze tylko mała uwaga, do tych sesji dodaje wartość abc lub 123 tylko przykładowo. Celem wstawiania tych wartości jest zabezpieczenie sie przed tworzeniem fake sesji, które dawałyby uprawnienia...

cms/rangi/pole.php do tego odwoluje sie login.php tu sprawdzane sa wartosci login i haslo i tworzone sa sesje...
Kod
<?php
session_start();

$link = mysql_connect('127.0.0.1','root','haslo);
mysql_select_db('portal');
$user = $_POST['login'];
$result = mysql_query("SELECT * FROM phpbb_users WHERE username = '$user'");
$pass = $_POST['pass'];
$pass = md5($pass);
$row = mysql_fetch_array($result);
     if($pass == $row['user_password']){
        
         switch ($row['user_id'])
         {
         case 2: $_SESSION[$user] = '123'; break;
         case 3: $_SESSION[$user] = 'abc'; break;
         default: echo('zalogowany jako none'); break;
         }
        
     }
mysql_close($link);



?>

i chyba to wszystko.
Problem tkwi w tym, że include np. admin.php jeżeli jestesmy zalogowani na admina działa tylko, gdy jestesmy na stronie index.php?id=pole (normalna strona główna z dodaną wartością cms/rangi/pole.php).

Bawię się w PHP od września, więc nie wymagajcie odemnie za dużo... prosiłbym o radę, żebym wreszcie uporał się z tym problemem, dziekuję z góry!
Cysiaczek
Hmm... czy przeczytanie regulaminu forum jeszcze się kwalifikuje pod niedużo? smile.gif

Przenoszę na Przedszkole


Pozdrawiam.
mASTEreq
problem rozwiązałem, ale częściowo biggrin.gif
zawartość pole.php dałem do index.php a formularz login.php wyedytowałem na action="index.php" teraz działa, ale...
Ale jest następujące. Jak zrobić, aby w sesji była nazwa uzytkownika i jakiś id, który byłby znany tylko systemowi i ewentualnie użytkownikowi... Myślalem nad:
Kod
switch ($row['user_id'])
        {
        case 2: $_SESSION[$user] = $pass; break;
        case 3: $_SESSION[$user] = $pass; break;
        }

gdzie $user i $pass to dane pobrane z bazy danych po prawidlowym zalogowaniu.
ale jak z kolei się odwoływać do tego np. na stronie głównej skoro są to tylko zmienne które biorą dane z $_POST :/
prosze o pomoc..
dem
to moze ja tylko wspomne ze sesja ma swoj identyfikator, a skoro ma swoj identyfikator tzn. ze kazdy user ma swoja "wlasna" prywatna sesje (np. po poprawnym zalogowaniu)..tzn, ze w sesji nie musisz przechowywac danych na zasadzie takiej jak napisales:
  1. <?php
  2. $_SESSION[$user] = costam;
  3. ?>

bo sesja jednego usera nie moze byc czescią sesji innego usera :S

wystarczy
  1. <?php
  2. $_SESSION['user'] = costam;
  3. ?>


a odwolanie do tego chyba juz jest dla ciebie zrozumiale?
mASTEreq
No ok, ale to nie rozwiązuje problemu. Jeżeli warunek, który sprawdza prawdziwość sesji wygląda tak:
Kod
<?php
if ($_SESSION['admin']=='costam') {
include('cms/rangi/admin.php');
                   }
else if ($_SESSION['user']=='costam') {
include('cms/rangi/user.php');
                   }
else {
include('cms/rangi/login.php');
      }
?>

za costam wstawiłbym np. $login.'jakisciag'.$pass, gdzie jakisciag bylby tajny. Przy uzyciu exploda o jakisciag wyciagnolbym login i haslo, ktore mogloby sie przydac chocby przy komentarzach, w ktorych widnialby nick autora...

Teraz jak do costam w tym sprawdzaniu autentycznosci wcisnac $login i $pass (wartosci) bo jak dam same zmienne bez $_POSTA to nic z tego nie wyjdzie, ma ktoś jakiś pomysł? biggrin.gif
Proszę o pomoc!!
dem
ale widze ze nie rozumiesz czym sa sesje i w jaki sposob sa one przechowywane...

  1. <?php
  2. $_SESSION
  3. ?>


to tablica w ktorej mozesz miec n wymiarow, czyli mozesz przechowywac sobie ile chcesz roznych wartosci, w roznych wymiarach bez potrzeby wykorzystywania explode...
  1. <?php
  2. $_SESSION['auth']['username'] = 'admin';
  3. $_SESSION['auth']['userpass'] = 'haslo';
  4. $_SESSION['auth']['userid'] = '12345678';
  5. etc...
  6. ?>


jesli nie wierzysz to napisz sobie to co wyzej a potem pod psodem dodaj
  1. <?php
  2. echo '<pre>';
  3. print_r($_SESSION);
  4. echo '</pre>';
  5. ?>


i zobaczysz ze to jest bardzo ladna i wygodna tablica... ehh, proponuje Ci dowiedziec sie w manalu jakie sa mozliwosci sesji, a dopiero potem pisac na nich cokolwiek

edit:

a co do "tajnosci" tych danych, to zastanow sie najpierw w jaki sposob ktos moze przechwycic czyjas sesje i bron sie przed tym, bo odkodowywanie caly czas danych z bezpiecznej sesji przy malutkim projekcie sie jest nieoptymalne

edit:

ps. wymiar 'auth' nie jest potrzebny, od tak do grupowania odpowiednich wartosci, aby przy print_r wiadomo bylo co gdzie jest...
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.