2011-09-05 11 views
0

データベース管理セッションで動作するようにログインスクリプトを取得しようとしています。データベースセッションを使用してログインしていますか?

これは私のデータベースセッションクラスです:

class SessionManager { 
    var $life_time; 

    function SessionManager() { 
     // Read the maxlifetime setting from PHP 
     $this->life_time = 600; //10 minutes 

     // Register this object as the session handler 
     session_set_save_handler(array(&$this, "open"), 
           array(&$this, "close"), 
           array(&$this, "read"), 
           array(&$this, "write"), 
           array(&$this, "destroy"), 
           array(&$this, "gc") 
           ); 
    } 

    function open($save_path, $session_name) { 
     global $sess_save_path; 

     $sess_save_path = $save_path; 
     // Don't need to do anything. Just return TRUE. 
     return true; 
    } 

    function close() { 
     return true; 
    } 

    function read($id) { 
     // Set empty result 
     $data = ''; 

     // Fetch session data from the selected database 
     $time = time(); 

     $newid = mysql_real_escape_string($id); 
     $sql = "SELECT 
        `session_data` 
       FROM 
        `sessions` 
       WHERE 
        `session_id` = '$newid' 
       AND 
        `session_expire` > $time"; 

     $rs = mysql_query($sql);       
     $a = mysql_num_rows($rs); 

     if($a > 0) { 
      $row = mysql_fetch_assoc($rs); 
      $data = $row['session_data']; 
     } 

     return $data; 
    } 

    function write($id, $data) { 
      // Build query     
      $time = time() + $this->life_time; 

      $newid = mysql_real_escape_string($id); 
      $newdata = mysql_real_escape_string($data); 

      $sql = "INSERT INTO `sessions` (`session_id`, `session_data`, 
               `session_expire`, `session_agent`, 
               `session_ip`) 
              VALUES 
              (\"".$id."\", \"".$data."\", 
              \"".time()."\",\"".$_SERVER['HTTP_USER_AGENT']."\", 
              \"".$_SERVER['REMOTE_ADDR']."\") 
              ON DUPLICATE KEY UPDATE 
              `session_id` = \"".$id."\", 
              `session_data` = \"".$data."\", 
              `session_expire` = \"".time()."\""; 

      $rs = mysql_query($sql) or die(mysql_error()); 

      return true; 
    } 

    function destroy($id) { 
     // Build query 
     $id = mysql_real_escape_string($id); 
     $sql = "DELETE FROM `sessions` WHERE `session_id`='$id'"; 
     mysql_query($sql); 

     return true; 
    } 

    function gc(){ 
     // Garbage Collection 
     // Build DELETE query. Delete all records who have passed the expiration time 
     $sql = 'DELETE FROM `sessions` WHERE `session_expire` < UNIX_TIMESTAMP();'; 
     mysql_query($sql); 

     // Always return TRUE 
     return true; 
    } 
} 

これは私のログインクラスの一部です:

function process_login(){ 
     global $mysql_prefix; 

     $email = mysql_real_escape_string($_POST['email']); 
     $check = mysql_query("SELECT password,salt,id FROM ".$mysql_prefix."users WHERE email='$email'"); 

     if(mysql_num_rows($check) > 0){ 
      $info = mysql_fetch_assoc($check); 
      $private_key = $this->get_secret_key(); 
      $password = hash('sha256', $info['salt'] . hash('sha256', $private_key.$_POST['password'])); 

      if($password == $info['password']){ 
       $_SESSION[$this->user_session]['id'] = $info['id']; 

       return true; 
      }else{ 
       return false; 
      } 
     }else{ 
      return false; 
     } 
    } 

私はglobal.phpファイルにセッションクラスを必要とするクラスを求めています(またはそれが呼び出されているもの)が、実際に私の現在のログインクラスでこの新しいデータベースセッションシステムを使用してどのように使用しますか?

私はこのような$ManageSessions->write(id, data)を使用しようとしました:

function process_login(){ 
     global $mysql_prefix; 

     $email = mysql_real_escape_string($_POST['email']); 
     $check = mysql_query("SELECT password,salt,id FROM ".$mysql_prefix."users WHERE email='$email'"); 

     if(mysql_num_rows($check) > 0){ 
      $info = mysql_fetch_assoc($check); 
      $private_key = $this->get_secret_key(); 
      $password = hash('sha256', $info['salt'] . hash('sha256', $private_key.$_POST['password'])); 

      if($password == $info['password']){ 
       $SessionManager->write(session_id(),$info['id']); 

       return true; 
      }else{ 
       return false; 
      } 
     }else{ 
      return false; 
     } 
    } 

しかし、動作するようには思えない、とのデータがページが更新された第二に上書きされます。

明らかなものがないか、間違ったものをコーディングする必要があります。

(私はスクリプト内のセキュリティ上の欠陥を認識していて、私はそれを再設計する過程で午前ので、セキュリティについては何も言うことなどしないでください。おかげで:))

答えて

4

クラス以上の代替のPHPののクラス内のシステムとのセッションシステム。クラスの新しいインスタンスを作成すると、そのコンストラクタ(function SessionManager() {)が呼び出され、クラスの関数がphpのデフォルトの代わりに実行されるように設定されます。だから、$_SESSIONに何かを書くと、SessionManagerの書き込み関数が使用され、SessionManagerの書き込み関数がデータベースに追加されます。

基本的に、すべてのページでそのクラスを初期化して、通常どおりにセッションを使用してください。それらはすべてデータベースに表示されます。

+0

ああ、私の世界は少し小さくなっています:)。乾杯! – MrE

関連する問題