2011-11-14 17 views
1

私がPHPで自分の役割を設計した方法は次のとおりです。ユーザーがログインすると、ユーザーがモデレーターかどうかがチェックされます。セッションとクッキーの役割をPHPで

シンプルなユーザーの場合、httpsを必要としないCookieを取得します。それ以外の場合は、 は彼が司会者であれば、私はこのような特別セッション割り当てます、

ini_set('session.use_only_cookies',true); 
session_start(); 

    //generate pass for the database && session 
    $pass=microtime().Moderator::generate_salt(30); 
    //Insert pass 
    Moderator::insert_moderator($pass); 

    //Encrypt the pass and give it back to the users session ID 
    $_SESSION["mod"]=$mod->encrypt_pass($pass); 

上記のコードは、司会者がログインログイン時間を要するランダム塩、および挿入を添付またはモデレーターは、場合によっては合格更新しセッションが開始されたか、終了しました(この場合は、ログイン時にmodにセッションが割り当てられます)。

はまた、これは私が使用して暗号化し、dycryption alogrithmであることに気づく:

 public function encrypt_pass($session_id) 
    { 
     $session_id=strip_tags($session_id); 
     $session_id=trim($session_id); 
     //inititialization vector is being created.- a seed for random encryption and decryption 
     srand((double)microtime()*10000); 
     //opens an ecryption algorithm for use. 
     $this->td=mcrypt_module_open(MCRYPT_RIJNDAEL_256,'',MCRYPT_MODE_CFB,''); 
     //creates an IV for out encryption. Two parameters: size of IV ti create and method used to create IV 
     $this->iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($this->td), MCRYPT_RAND); 
     //get maximum size the algorithm will take. 
     $this->ks=mcrypt_enc_get_key_size($this->td); 
     //here teh key is created 
     $this->keys=substr(sha1(Moderator::generate_salt()),0, $this->ks); 
     //initialize the algorithm engine using , IV, and key we selected 
     mcrypt_generic_init($this->td,$this->keys,$this->iv); 
     //Two parameters, the algorithm resource and the data we actually want to encrypt. returns an incrypted value 
     $this->ciphertext=mcrypt_generic($this->td,$session_id); 
     //clean up!! parameter is -- algorithm resource 
     mcrypt_generic_deinit($this->td); 
     //end clean up!! 
     mcrypt_module_close($this->td); 
     //Goes to the moderators session $_SESSION['$ciphertext'] 
     return $this->ciphertext; 
    } 

    public function decrypt_pass($session_id) 
    { 
     $session_id=strip_tags($session_id); 
     $session_id=trim($session_id); 

     mcrypt_generic_init($this->td, $this->keys,$this->iv); 
     $plaintext=mdecrypt_generic($this->td,$session_id); 
     mcrypt_generic_deinit($this->td); 
     mcrypt_module_close($this->td); 
    } 

これは、ハッカーがモデレーターのセッションIDをキャッチすることはあまりにも難しいだろう、セッションの固定化/ハイジャックから私を防ぐ必要があり、モデレータが別のリクエストを行うとすぐにパスワードがリセットされ、ブラウザを閉じるとセッションが終了します。これにより、ハッカーはパスワードを取得して司会者のふりをするための小さな時間枠を残します。

質問:セッションハイジャック/固定に対処するには十分ですか、他の予防措置を追加する必要がありますか?

このアルゴリズムを使用する方法が要求と応答を遅くすることは事実です。モデレーターの限られた数があるでしょう、これ以上の

10以下のコードは、モデレータのすべての要求に自身を更新しますが、あなたのアルゴリズムの

+0

私はこの暗号化/復号化が何のためにあるのかよく分かりません。ユーザーとの間で唯一送信されるのは、セッションCookieを介したセッションIDです。誰かがそのセッションIDを取得すると、セキュリティはウィンドウの外に出ます。 –

+0

どうすればセッションの固定/ハイジャックを防ぐことができますか?私のスクリプトは、新しいIDを生成します。多くの場合、モデレータが作成するすべての要求が生成されます。つまり、セキュリティをどのように改善できますか? –

+2

セッション固定は、URLでセッションIDを渡すことを許可しても、Cookieのみを強制しているので問題にはなりません。セッションのハイジャックは、session_regenerate_id()で定期的にセッションを変更することで軽減できます。http://en.wikipedia.org/wiki/Session_hijacking#Prevention –

答えて

0

弱点は、あなたがとにかく特定のユーザーを識別していないということです。あなたはそこに時間といくつかのランダムな塩を入れているだけです。 セッション/ Cookieのハイジャックを防ぐには、できるだけ多くの識別要素を暗号化された文字列に入れる必要があります。たとえば、クライアントのOS、ユーザエージェント、ブラウザのバージョン、IP、転送されたIPなど。この場合、あなただけがあなたがAESキーを持っているので、暗号化された文字列に挿入したすべてのパラメータを検証するので、あなたがあなたに送った文字列を解読できます。おそらく誰かがセッションをハイジャックし、あなたがそれを破壊する必要があることを意味します。

スホシンをhttp://www.hardened-php.net/suhosin/で見てみましょう。これはあなたのために上記のすべてを行うPHPのプラグインです。透明で軽量です。 Suhosinを使用する場合、javascriptは暗号化されていないCookieを設定し、サーバーはそれを読み取ることができないため、javascriptを使用してCookieを設定することに注意してください。

関連する問題