2009-12-11 4 views
5

私は(これまでのところ)クライアント側のクッキーとデータベースエントリでユーザーセッションを処理してきました。PHPでクライアントのセッションを安全に処理する

ユーザーがログインすると、guidを生成してクライアントのコンピュータ上のクッキーに配置します。次に、私は 'セッション'のMySQLテーブルにエントリを作成し、GUID、IPアドレス、ユーザー名、特権などを追加します。ユーザーがページにアクセスすると、セッションCookieがあるかどうかを確認します。もしそうなら、私はクッキー内のGUIDのデータベースをチェックし、IPアドレスが一致していることを確認します。そうであれば、ユーザーは残りの情報と共にdbテーブルにログインします。何かが間違っている場合(悪いIPアドレス、期限切れのセッションなど)、私はデータベースエントリを削除し、guid cookieを削除します。

以前はグローバルな$ _SESSIONを使ったことがありません。

私のやり方は良い練習ですか、これをどう扱っているか再考する必要がありますか?

+1

あなたはホイールを私の友人 –

答えて

7

ですね。ただし、手動ですべてを行う場合は、実際には$_SESSIONを実装するだけで、すでにすべてのことを行うことができます。

データベースを使用してセッションを処理する場合は、デフォルトのセッション処理を独自にオーバーライドできます。 session_set_save_handler()を見てください。私は私のアプリでこれを行う。

class SessionHandler 
{ 

    public function open($save_path, $session_name) 
    { 
     $this->sessionName = $session_name; 
    return(true); 
    } 
    public function close() { 
     //stuff 
    } 

    public function read($id) { 
     $expiretime = date("Y-m-d H:i:s",time() - $this->maxLifeTime); 
     $sql = "SELECT * FROM sessions where sessionid='".$this->db->escapeData($id)."' AND lastupdated>='".$expiretime."' LIMIT 1"; 
    $result = $this->db->query($sql); 
     //etc. 
    } 

    //etc. 

    public function setAsSessionHandler() 
    { 
    session_set_save_handler(
     array($this,'open'), 
     array($this,'close'), 
     array($this,'read'), 
     array($this,'write'), 
     array($this,'destroy'), 
     array($this,'gc') 
    ); 
    } 
} 

$sessionHandler = new SessionHandler(); 
$sessionHandler->setAsSessionHandler(); 

あなたはちょうどあなたがこれを使って、自分自身を実装しましたことを説明したが、それでもあなたのためにそれを行うには$ _SESSIONの力を持っているすべての機能を持つことができます。

たとえば、セッションを開始する前にセッションがまだ有効かどうかを確認するためにIPチェックを追加する場合は、そのセッションを「開く」機能の一部として追加できます。セッションデータを10種類の異なるデータベースに書きたい場合は、「書き込み」機能でこれを行うことができます。

これらの関数はすべて、$ _SESSIONの使い方に基づいて使用され、単純なクラスに入れておくことで、非常に効果的に動作するように管理できます。

セッションIDは、読み取り/書き込み/破壊関数に渡されるパラメータであり、GUID生成ルーチンを使用して同様に管理します。しかし、あなたはguid生成とチェックをこのセッションマネージャクラスに張り付けることができ、open()関数で単純に行うことができます。中央集中型、マッスルなし、大騒ぎなし。

1

現在のユーザーを他のデータベース情報にリンクしなければならない場合は、今やっている方法が良いです。

簡単にするために、セッションを使用するのが好ましい方法です。 www.php.net/sessionsで少し読んで、そこからあなたの心を作り上げることをお勧めします。使い方は非常に簡単ですが、データベーステーブルを使用するより柔軟性がありません。必要なすべての値を設定することはできますが、データベース操作に使用する必要がある場合はいつでもそれらをフェッチしてクエリに挿入する必要があります。

+0

に再発明していますが、それは良い点ですが、zombatsセッションハンドラクラスはセッションのデータベース部分を少しシームレスにします。 –

1

あなたは正しい軌道にいると思います。実際には、アプリケーションのセキュリティ要件に依存することになります。 $ _SESSIONは$ _COOKIE:とよく似ていますが、ページリフレッシュの間に状態を提供するメカニズムと考えることができます。この文脈では、あなたのユーザーの身元。データベースは、さらなる認証メカニズムを提供する必要があります。ユーザーを一意に識別できるもの典型的な仮定はIPアドレスですが、誰かのIPが変わったらどうなりますか?ユーザーエージェントも別の可能性がありますが、これらは非常にユニークではありません。私は見てみることをお勧め

:あなたがカバー基本を持っているようhttp://php.net/manual/en/session.security.php

+0

私はIPアドレスが十分だと思います。なぜなら、とにかくほとんどの人がルータの後ろにいるからです。通常はIPをリフレッシュするいくつかの内部メカニズムとともに、ルータがリセットされない限り(通常は私の経験では)リフレッシュしません。また、ユーザーのIPリフレッシュが重大な要因であったとしても、ユーザーがログインし直さなければならないということは、私自身の実装では、通常、セッションを約3〜4時間で期限切れにします。 –

+0

それはすべて本当です。私はモバイルクライアントについてもっと考えていました。サイトが電話でアクセスされる場合、その人が外出している場合は、IPが変更される可能性がはるかに高いです。それでも、これは通常、ほとんどの人にとってWebトラフィックのかなりの部分です。 – Brad

+0

また、データベースとシームレスな$ _SESSIONの統合を探しているなら、Zend FrameworkのZend_Authコンポーネントを見てください。 – Brad

関連する問題