Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Klasa logowania
Forum PHP.pl > Forum > Przedszkole
-edo-
Witam. Mam pytanie dotyczące klasy logowania.
  1. <?php
  2. class UserAuth {
  3.  
  4. var $pass;
  5. var $user;
  6.  
  7. function UserAuth() {
  8. }
  9.  
  10.  
  11. function getsession() {
  12. }
  13.  
  14.  
  15. function getmysqlrow(){
  16. }
  17.  
  18.  
  19. function checkuser() {
  20. }
  21.  
  22. }
  23.  
  24. $user = new UserAuth;
  25. ?>

Tak będzie się przedstawiał szkielet klasy. Konstruktor będzie pobierał dane z formularza a następnie je walidował. Jeżeli wszystko będzie okey, wywoła metodę checkuser, która sprawdzi, czy występuje w bazie, jeżeli będzie okey, przejdzie do metody getsession, która utworzy zmienne sesyjne. Funkcja getmysqlrow, będzie wyświetlała dane o userze jezeli sesja bedzie istniała.

W taki sposób zamierzam to zrobić, aczkolwiek, niestety nie wiem czy taki sposób jest dobry. Proszę o jakieś opinie, albo o własne przemyślenia lub przykłady.

Z góry dziękuje
rzepski666
to moze tak:
konstruktor przypisuje pola $user i $pass
funkcja check sprawdza w bazie i zwraca id z bazy albo false
set session zapisuje w bazie.

bardzo fajnie rozwiazane jest to w zendzie - pomysl czy nie zrobic tego na singletonie
B3F064
Z zendami i singeltonem nie miałem styczności

Stworzyłem już klasę, która to sprawdza, aczkolwiek chcę mieć pewność iż będzie ona bezpieczna.

  1. <?php
  2. // wg twoich wskazówek
  3.  
  4. function UserAuth() {
  5.     $user = addslashes(strtolower($this->user));
  6.     $password = addslashes(md5(strtolower($this->password)));
  7. }
  8.  
  9. function checkuser() {
  10.    
  11. if(isset($this->password) && !empty($this->password))
  12. {
  13.    $query = "SELECT * FROM users WHERE password = '$password' AND user='$user'";
  14.    $sql = mysql_query($query);
  15.    if(!mysql_num_rows($sql)) {
  16.    return false;
  17.    }
  18.    else{
  19.    return $this->checksession();
  20.    }
  21. }
  22. }
  23. ?>


Jest to jedynie zalążek, dlatego chcę po części dążyć do maksymalnej poprawy kodu.
drPayton
  1. <?php
  2. $user = addslashes(strtolower($this->user));
  3.    $password = addslashes(md5(strtolower($this->password)));
  4. ?>


1. Zapomnij o istnieniu funkcji addslashes() jeśli nie masz narzędzia do sprawdzania/usuwania nadmiarowych slashy. Korzystaj z funkcji odpowiedniej dla bazy danych, no mysql_real_escape_string dla mysql.
2. Jeśli hasło zapisywane w bazie jest w postaci hashu md5 nie ma sensu z jakikolwiek sposób walidować go pod kątem potencjalnych "hacków", wystarczy samo md5($_POST['haslo'])
-edo-
Co do adslashes, to będą usunięte.

Jeżeli chodzi o mysql_real_escape_string to posiadam inną funkcję, która odgórnie waliduje czy dane wejściowe filtrować.

  1. <?php
  2. function htmlspecials($FullHTML=0)
  3.    {
  4.        
  5.        if (isset($FullHTML) && $FullHTML==1)
  6.        {
  7.            foreach($_POST as $key=>$value)
  8.            {
  9.            if (!get_magic_quotes_gpc()) {
  10.            $_POST[$key] = addslashes($value);
  11.            } else {
  12.            $_POST[$key] = $value;
  13.            }
  14.            }
  15.            return true;
  16.        }
  17.        else if (isset($FullHTML) && $FullHTML==2)
  18.        {
  19.              foreach($_POST as $key=>$value)
  20.            {
  21.                $s = array('"', "'", '<', '>');
  22.                $z = array('&quot;', '&apos;', '&lt;', '&gt;');
  23.                $value = str_replace($s, $z, $value);
  24.                $_POST[$key] = $value;    
  25.            }
  26.            return true;
  27.        }
  28.        else
  29.        {
  30.            foreach($_POST as $key=>$value)
  31.            {
  32.                $s = array('"', "'", '<', '>');
  33.                $z = array('&quot;', '&apos;', '&lt;', '&gt;');
  34.                $value = str_replace($s, $z, $value);
  35.                $_POST[$key] = $value;
  36.            }
  37.    
  38.            return true;
  39.        }
  40.  
  41.        return false;
  42.    }
  43. ?>


Prosta funkcja, która zamienia nieprzyjazne stringi na encje, oczywiście nie jest to pewnie na sto procent zabezpieczające ale myślę że jest okey.
Jeżeli chodzi o logowanie to bardziej mnie interesuje własny mechanizm sesji zapisywany do bazy. Czy warto stworzyć własny session handler? Na potrzeby strony?
drPayton
Cytat(-edo- @ 7.10.2008, 07:42:21 ) *
(...)
Czy warto stworzyć własny session handler? Na potrzeby strony?

Warto mieć, ale czy warto tworzyć? W ramach treningu na pewno, ale ja polecam jednak stosowną klasę ZendFramework'a ;)
-edo-
Jak to klasa zenda??
drPayton
Poczytaj: http://framework.zend.com/manual/en/zend.session.html smile.gif
-edo-
Mój cały skrypt logowania. Prosty i krótki.
  1. <?php
  2. require_once "core.php";
  3. header_top("Logowanie");
  4. echo "<table>";
  5.  
  6. class UserAuth
  7. {
  8.    var $password;
  9.     var $user;
  10.    
  11.    function start()
  12.    {    
  13.     $this->checkuser();
  14.    }
  15.    
  16.     function checkuser() {    
  17.     if(isset($this->password) && !empty($this->password)) {
  18.        $user = strtolower($this->user);
  19.        $password = md5($this->password);
  20.  
  21.     } else if(isset($_COOKIE['uauth_logc']) && !isset($_SESSION['uauth_loged'])) {
  22.         $r = explode("::", $_COOKIE['uauth_logc']);
  23.         $level = $r[2];
  24.         $user = $r[1];
  25.         $password = $r[0];
  26.  
  27.     } else if(isset($_SESSION['uauth_loged']) && $_SESSION['uauth_loged']==1) {
  28.         $user = $_SESSION['uauth_login'];
  29.        $password = $_SESSION['uauth_pass'];
  30.     } else {
  31.     return false;
  32.     }
  33.     $sql = "SELECT * FROM users WHERE password = '$password' AND user='$user' LIMIT 0,1";
  34.     $query = mysql_query($sql);
  35.     if(!mysql_num_rows($query)) {
  36.    return false;
  37.     }
  38.     else{
  39.     return $this->checksession($sql);
  40.     }
  41.    
  42.     }
  43.    
  44.    function checksession($sql) {
  45.    if(!isset($_SESSION['uauth_loged'])) {
  46.    $query = mysql_query($sql);
  47.    while($row = mysql_fetch_object($query))
  48.    {
  49.        if(isset($_POST['zapamietaj'])){
  50.        setcookie("uauth_logc", "".$row->password."::".$row->user."::".$row->rights."", time()+24*360);
  51.        }
  52.        $_SESSION['uauth_login'] = $row->user;
  53.        $_SESSION['uauth_pass'] = $row->password;
  54.        $_SESSION['uauth_level'] = $row->rights;
  55.        $_SESSION['uauth_loged'] = 1;
  56.        }
  57.    }
  58.    }
  59. }
  60.  
  61.  
  62.  
  63. $u = new UserAuth;
  64. if(isset($_POST['user_login']) && isset($_POST['user_pass'])) {
  65. $u->password = $_POST['user_login'];
  66. $u->user = $_POST['user_pass'];
  67. } else {
  68.  
  69. }
  70. $u->start();
  71. if(isset($_GET['logout'])) {
  72. setcookie("uauth_logc", "", time()-32);
  73. header('location: login.php');
  74. }
  75.  
  76. if(!isset($_SESSION['uauth_loged'])) {
  77. ?>
  78. <form method="POST" action="">
  79.  
  80. <div>Login <input type="text" name="user_login" ></div>
  81. <div>Hasło <input type="password" name="user_pass" ></div>
  82. <div><input type="checkbox" name="zapamietaj" /> - Zapamiętaj hasło</div>
  83. <div><input type="submit" name="login" value="Zaloguj" class="submit"/></div>
  84.  
  85. </form>
  86.  
  87. <?php
  88. } else {
  89. ?>
  90. <a href="?logout">wyloguj</a>
  91. <?php
  92. }
  93. echo "</table>";
  94. footer_bt(1);
  95. ?>
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.