私が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以下のコードは、モデレータのすべての要求に自身を更新しますが、あなたのアルゴリズムの
私はこの暗号化/復号化が何のためにあるのかよく分かりません。ユーザーとの間で唯一送信されるのは、セッションCookieを介したセッションIDです。誰かがそのセッションIDを取得すると、セキュリティはウィンドウの外に出ます。 –
どうすればセッションの固定/ハイジャックを防ぐことができますか?私のスクリプトは、新しいIDを生成します。多くの場合、モデレータが作成するすべての要求が生成されます。つまり、セキュリティをどのように改善できますか? –
セッション固定は、URLでセッションIDを渡すことを許可しても、Cookieのみを強制しているので問題にはなりません。セッションのハイジャックは、session_regenerate_id()で定期的にセッションを変更することで軽減できます。http://en.wikipedia.org/wiki/Session_hijacking#Prevention –