Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Logowanie na bazie MySQL, a nie na sesjach - bezpieczne?
infoo1
post 12.12.2008, 22:05:07
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 12.11.2008

Ostrzeżenie: (0%)
-----


Mam pomysł na zrobienie takiego logowania na bazie:
1. Nie ma sesji, ani cookies.
2. Struktura tabeli z sesjami:


Kod
+---------+------------+--------------+---------+------------+-------------+
| user_id | session_id | user_browser | user_ip | start_time | remember_me |
+---------+------------+--------------+---------+------------+-------------+


Objaśnienia:
  • user_id:
    id użytkownika z tabeli prefix_users
  • session_id:
    "sid". Planuję go przekazywać w adresie (index.php?mode=blablabla&sid=tu_sid). //W PHP była funkcja generująca sid. Jak się nazywała?
  • user_browser:
    $_SERVER['HTTP_USER_AGENT'];
  • user_ip:
    $_SERVER['REMOTE_ADDR'];
  • start_time:
    time(); przy logowaniu. W konfiguracji ustalam po jakim czasie ma wylogowywać (tabela prefix_config).
  • remember_me:
    auto-logowanie
3. Przy każdym odświeżeniu strony sprawdzam, czy zgadza się user_browser, user_ip, start_time, session_id.
4. Remember_me: działa, jeśli jest dozwolone w konfiguracji.
Pytania:
1. Czy to bezpieczne? Coś pominąłem?
2. Czy sprawdzać oprócz tego $_SERVER['X_FORWARDED_FOR']; //I czemu nie znalazłem tego w manualu?
3. Na ile powinienem ustawić domyślny czas trwania sesji (bo może być albo domyślny, albo na zawsze (remember_me może być 0 lub 1)).

Ten post edytował infoo1 12.12.2008, 22:05:22
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
infoo1
post 19.12.2008, 16:39:34
Post #2





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 12.11.2008

Ostrzeżenie: (0%)
-----


Nie zawsze ma się dostęp do takich rzeczy


Jednak wracam do starego sposobu:
  1. <?php
  2. class user
  3.  {
  4.    var $userdata = array();
  5.  
  6.  
  7.    function session_begin()
  8.    {
  9.      $this->assign_userdata();
  10.      $this->assign_session_userdata();
  11.    }
  12.  
  13.    function session_kill()
  14.    {
  15.      unset($_SESSION);
  16.      unset($this->userdata);
  17.    }
  18.  
  19.    function assign_userdata()
  20.    {
  21.      global $db;
  22.      $sql = "SELECT * FROM ".USERS_TABLE." WHERE user_id='".$this->get_user_id()."'";
  23.      $sql = $db->sql_query($sql);
  24.      $i++;
  25.      while ($row = $db->sql_fetcharray($sql))
  26.      {
  27.        foreach ($row as $key => $value)
  28.        {
  29.          $this->userdata[$key] = $value;
  30.        }
  31.      }
  32.  
  33.      if($this->userdata['user_id'] !== 0)
  34.      {
  35.        $this->userdata['is_registered'] = true;
  36.      }
  37.      else
  38.      {
  39.        $this->userdata['is_registered'] = false;
  40.      }
  41.    }
  42.  
  43.    function assign_session_userdata()
  44.    {
  45.      $_SESSION['user_id']    = $this->userdata['user_id'];
  46.      $_SESSION['user_login'] = $this->userdata['user_login'];
  47.      $_SESSION['user_pass']  = $this->userdata['user_pass'];
  48.      $_SESSION['user_grade'] = $this->userdata['user_grade'];
  49.    }
  50.  
  51.    function get_user_id()
  52.    {
  53.      if(isset($_SESSION['user_id']))
  54.      {
  55.        return $_SESSION['user_id'];
  56.      }
  57.      else
  58.      {
  59.        $_SESSION['user_id'] = 0;
  60.        return 0;
  61.      }
  62.    }
  63.  
  64.    function login($login,$pass)
  65.    {
  66.      global $db, $main;
  67.      $browser = $_SERVER['HTTP_USER_AGENT'];
  68.      $ip      = $_SERVER['REMOTE_ADDR'];
  69.      $sid     = $this->generate_sid();
  70.  
  71.      $sql = "SELECT user_id FROM ".USERS_TABLE." WHERE user_login='".$login."' AND user_pass='".$password."'";
  72.      $sql = $db->sql_query($sql);
  73.      while ($row = $db->sql_fetcharray($sql))
  74.      {
  75.        $_SESSION['user_id'] = $row['user_id'];
  76.      }
  77.      $main->redirect($main->generate_url('UCP',true,$sid));
  78.      return true;
  79.    }
  80.  
  81.    function register()
  82.    {
  83.      global $main;
  84.  
  85.      if(empty($_POST['login'])){
  86.        $errcodes[] = 'EMPTY_LOGIN';
  87.      }
  88.      if(strlen($_POST['login']) > $main->config['login_max_strlen']){
  89.        $errcodes[] = 'LONG_LOGIN';
  90.      }
  91.      if(strlen($_POST['login']) < $main->config['login_min_strlen']){
  92.        $errcodes[] = 'SHORT_LOGIN';
  93.      }
  94.  
  95.  
  96.      if(empty($mail))
  97.      {
  98.        $errcodes[] = 'EMPTY_MAIL';
  99.        $check_mail = false;
  100.      }
  101.      if ($check_mail && !eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})$", $_POST['mail']))
  102.      {
  103.        $errcodes[] = 'INVALID_MAIL';
  104.      }
  105.  
  106.  
  107.      if(empty($_POST['pass'])){
  108.        $errcodes[] = 'EMPTY_PASS';
  109.      }
  110.      if(strlen($_POST['pass']) > $main->config['pass_max_strlen']){
  111.        $errcodes[] = 'LONG_PASS';
  112.      }
  113.      if(strlen($_POST['pass']) < $main->config['pass_min_strlen']){
  114.        $errcodes[] = 'SHORT_PASS';
  115.      }
  116.  
  117.  
  118.      if(count($errcodes) > 0)
  119.      {
  120.        $sql = "";
  121.      }
  122.      else
  123.      {
  124.        global $template, $lang;
  125.  
  126.        foreach ($errcodes as $key => $value)
  127.        {
  128.          /*switch ($value)
  129.           {
  130.             case 'EMPTY_LOGIN':
  131.               $value2 = $lang->register['EMPTY_LOGIN'];
  132.             break;
  133.  
  134.             case 'LONG_LOGIN':
  135.               $value2 = $lang->register['LONG_LOGIN'];
  136.             break;
  137.  
  138.             case 'SHORT_LOGIN':
  139.               $value2 = $lang->register['SHORT_LOGIN'];
  140.             break;
  141.  
  142.             case 'INVALID_MAIL':
  143.               $value2 = $lang->register['INVALID_MAIL'];
  144.             break;
  145.  
  146.             case 'EMPTY_MAIL':
  147.               $value2 = $lang->register['EMPTY_MAIL'];
  148.             break;
  149.  
  150.             case 'EMPTY_PASS':
  151.               $value2 = $lang->register['EMPTY_PASS'];
  152.             break;
  153.  
  154.             case 'LONG_PASS':
  155.               $value2 = $lang->register['LONG_PASS'];
  156.             break;
  157.  
  158.             case 'SHORT_PASS':
  159.               $value2 = $lang->register['SHORT_PASS'];
  160.             break;
  161.  
  162.             default:
  163.               $value2 = $lang->register['DEFAULT'];
  164.             break;
  165.           }
  166.           $errmsgs[$key] = $value2; */
  167.          $errmsgs[$key] = $lang->register[$value];
  168.        }
  169.  
  170.        foreach ($errmsgs as $key => $value)
  171.        {
  172.          $template->assign_block_vars('registration_errors',array(
  173.            'ERROR' => $value
  174.          ));
  175.        }
  176.      }
  177.    }
  178.  
  179.    function generate_sid()
  180.    {
  181.      $chars  = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
  182.      $number = 40;
  183.      $strlen = strlen($chars)-1;
  184.  
  185.      $i   = 0;
  186.      $sid = '';
  187.  
  188.      while ($i < $number)
  189.      {
  190.        $id   = rand(0,$strlen);
  191.        $sid .= mb_substr($chars,$id,1);
  192.        $i++;
  193.      }
  194.      return $sid;
  195.    }
  196.  }
  197. ?>

2 pytania:
  1. Bezpieczne?
  2. Optymalne?
Go to the top of the page
+Quote Post

Posty w temacie
- infoo1   Logowanie na bazie MySQL, a nie na sesjach - bezpieczne?   12.12.2008, 22:05:07
- - Darti   A że tak zapytam, jakie są powody do rezygnowania ...   12.12.2008, 22:20:36
- - infoo1   1. 2 (i więcej) sesje się zlepiają w jedną, czyli ...   12.12.2008, 22:33:35
- - erix   Cytat1. 2 (i więcej) sesje się zlepiaj...   12.12.2008, 22:38:27
- - Darti   hmm ok, z Twojego rozwiązania wychodzi mi jedynie,...   12.12.2008, 22:46:12
- - infoo1   1. Nie, nie pograć. To program, nie gra. 2. Tu mog...   12.12.2008, 22:55:41
- - Darti   Ależ wszystko w porządku, sam nie polecam zachowyw...   12.12.2008, 23:10:11
- - infoo1   Nie do końca . Jeszcze jest $_SERVER['HTT...   12.12.2008, 23:16:28
- - Darti   IE nie przekazuje sesji między oknami (czy też FF ...   12.12.2008, 23:39:14
- - infoo1   0) Ale jak sprawdzam browsera, to pokaże coś inneg...   12.12.2008, 23:57:34
- - Darti   oj ... miałem na mysli dwa okna IE = dwie różne se...   13.12.2008, 00:07:25
- - infoo1   Cytatoj ... miałem na mysli dwa okna IE = dwie róż...   13.12.2008, 00:34:39
|- - Darti   Cytat(infoo1 @ 13.12.2008, 00:34:39 )...   13.12.2008, 00:41:57
- - infoo1   Cytatno i skąd bierzesz zmienne $sid, $u...   18.12.2008, 19:38:03
- - pest   Więc cała ta zabawa ma na celu:przeniesienie miejs...   19.12.2008, 08:58:41
- - ucho   Strasznie to wszystko skomplikowane - do podstawow...   19.12.2008, 11:14:00
- - infoo1   To rezygnuję z sid w linku. Cytat# ograniczenie i...   19.12.2008, 15:17:22
- - infoo1   Nie zawsze ma się dostęp do takich rzeczy Jedna...   19.12.2008, 16:39:34
- - Mize   Klasa User, u mnie jest modelem, a do obsługi mech...   19.12.2008, 17:00:18
- - infoo1   CytatKlasa User, u mnie jest modelem, a do obsługi...   19.12.2008, 17:03:29
- - Mize   Dużo by pisać. http://www.google.pl/search?q=php5...   19.12.2008, 17:13:42


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 20:31