Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Logowanie, czy na pewno tak jak trzeba
Forum PHP.pl > Forum > Przedszkole
jacke
Hej,

Mam skrypt logowania, który gdzieś w necie znalazłem, jednak nie był w 100% kompletny to kombinowałem jak uruchomić. W końcu się udało...
Skrypt też odczytuje z bazy danych rangę usera (1-admin, 2-user).

Chciałem znaleźć skrypt który byłby 'o tyle o ile' jakoś zabezpieczony przed kosmitami i tak się zastanawiam czy dobrze kombinuję jak wyświetlić zawartość po zalogowaniu:


Formularz standardowy:
  1. <form action="zaloguj.php" method="post">
  2. <label for="login">Login: </label><input type="text" name="login"/>
  3. <label for="password">Hasło: </label><input type="text" name="password"/>
  4. <input type="submit" value="zaloguj"/>
  5. </form>


No i php...
  1. <?php
  2. interface storage {
  3. public function login($name, $pass);//1
  4. }
  5. class mysqlStorage implements storage{//2
  6. public function login($name, $pass){//3
  7. global $pdo;
  8. $pdo=new PDO('mysql:host=localhost;dbname=test', 'root', '');
  9. $stmt=$pdo->prepare('SELECT name, ranga FROM `users` WHERE name=:name AND password=:password');
  10. $stmt->bindValue(':name', $name);
  11. $stmt->bindValue(':password', md5($pass));
  12. $stmt->execute();
  13. $user=$stmt->fetch();
  14. if($user){
  15. return $user;
  16. }
  17. return false;
  18. }// login();
  19. }//mysqlStorage
  20. class user{//4
  21. public $name;
  22. public $rank;
  23.  
  24. private $storage;
  25. public function __construct($storage){
  26. $this->storage=$storage;
  27. }
  28. public function zaloguj(){
  29. if($_SERVER['REQUEST_METHOD']=='POST'){
  30. $user=$this->storage->login($_POST['login'], $_POST['password']);
  31. if(!$user)die('Nieprawidłowa nazwa użytkownika lub hasło!');
  32. $this->name=$user['name'];
  33. $this->rank=$user['ranga'];
  34. $_SESSION['zalogowany']=true;
  35. $_SESSION['name']=$this->name;
  36. $_SESSION['rank']=$this->rank;
  37. }
  38. }
  39. }
  40. $user=new user(new mysqlStorage);
  41. $user->zaloguj()
  42. ?>
  43.  
  44. <?php
  45.  
  46. if ($_SESSION['rank'] == 1)
  47. { echo "Admin"; }
  48. elseif ($_SESSION['rank'] == 2)
  49. { echo "User"; }
  50. else
  51. { echo "What exactly you're trying to do?"; }
  52. ?>
smietek
  1. $stmt->bindValue(':name', $name);
  2. $stmt->bindValue(':password', md5($pass));

Skoro już używasz bindowania, to musisz dodać trzeci parametr, który określi rodzaj danych.
Po tym zabiegu skrypt będzie bezpieczny.
http://php.net/manual/en/pdo.constants.php - Tu znajdziesz stałe, których używasz do ustawienia typu danych.
jacke
Like this?
  1. $stmt->bindValue(':name', $name, PDO::PARAM_STR);
  2. $stmt->bindValue(':password', md5($pass), PDO::PARAM_STR);
Fifi209
Dokładnie tak smile.gif
Najprościej sprawdź czy działa ;>
jacke
Działa winksmiley.jpg

Generalnie to w sumie też chciałem zapytać czy taki sposób wyświetlania danych jest właściwy

  1. <?php
  2.  
  3. if ($_SESSION['rank'] == 1)
  4. { echo "Admin"; }
  5. elseif ($_SESSION['rank'] == 2)
  6. { echo "User"; }
  7. else
  8. { echo "What exactly you're trying to do?"; }
  9. ?>
smietek
Poleganie na sesjach to trochę kiepski pomysł, już lepiej zapisać gdzieś jakieś dane (w miarę bezpiecznie lub jak najmniejszą ich ilość) w Cookies, a potem za każdym razem je pobierać. Sesje są zdradliwe.

I nie za bardzo rozumiem dlaczego robisz takie dziwaczne wcięcia.
Mephistofeles
A niby czemu sesje mają być gorsze od ciastek?
Fifi209
Cytat(smietek @ 15.12.2010, 18:57:34 ) *
Poleganie na sesjach to trochę kiepski pomysł, już lepiej zapisać gdzieś jakieś dane (w miarę bezpiecznie lub jak najmniejszą ich ilość) w Cookies, a potem za każdym razem je pobierać. Sesje są zdradliwe.

Bardzo ciekawe rozumowanie, moim zdaniem kilkanaście razy prościej wykraść cookie niż przejąć sesję.

Chciałbym, abyś poparł swój post jakimiś kilkoma konkretnymi argumentami z przykładami.
Mephistofeles
Przecież przejęcie sesji w najlepszym wypadku sprowadza się do kradzieży ciastka, a Ty chcesz tylko ciastek używać...
jacke
Zostawmy dyskusje ciastka vs sesje na inny temat ;)

Cytat(smietek @ 15.12.2010, 19:57:34 ) *
I nie za bardzo rozumiem dlaczego robisz takie dziwaczne wcięcia.

Tzn tabulatory w kodzie? Tak mi wygodnie i dla mnie jest to przejrzyste :)

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.