2012-03-06 15 views
3

可能性の重複:
What do I need to store in the php session when user logged in?PHPセッションは、ログインのために十分安全ですか?

私は、ユーザーがログインするためにPHPのセッションを使用したい、私は自分の身元を確認したら、私はセッションで自分のuser_idとhas_logged_inを格納します。彼らがログインしていることを確認するために、自分のユーザーIDが設定されていて、has_logged_inがtrueであるかどうかを確認します。場合によっては、session_regenerate_id(true)を使用してセッションIDを再生成します。これは十分に安全ですか、ハイジャックやその他のセッションセキュリティの脆弱性を防止するためのさらなる対策が必要ですか?

+1

'has_logged_in'を保存する必要はありません。ユーザーをログアウトするときに' $ _SESSION = array(); 'を使うだけです。 –

+0

SSLなしの場合 – Petah

+0

SSLについて詳しく説明できますか? – Rain

答えて

7

用語

  • ユーザー:訪問者。
  • クライアント:特定のマシンにインストールされた特定のWeb対応ソフトウェア。あなたのセッションを安全にする方法を理解するためにセッション

    を理解


、あなたは最初のセッションがどのように機能するかを理解する必要があります。

はのは、コードのこの部分を見てみましょう:

session_start(); 

とすぐにあなたがいることを呼び出すと、PHPは(デフォルトで)PHPSESSIDと呼ばれるクッキーを探します。それが見つからない場合は、1を作成します。

PHPSESSID=h8p6eoh3djplmnum2f696e4vq3 

を、それが見つかった場合、それはPHPSESSIDの値をとり、その後、対応するセッションをロードします。その値はsession_idと呼ばれます。

これは、クライアントが知る唯一のものです。セッション変数に追加するものはすべてサーバー上にとどまり、決してクライアントに転送されません。 $_SESSIONの内容を変更すると、その変数は変更されません。あなたがそれを破壊するか、タイムアウトするまで、それは常に同じままです。したがって、クライアントがハッシュしたり、他の方法でクライアントがその情報を受け取ったり、送信したりすることがないので、$_SESSIONの内容を難読化しようとするのは役に立たない。

次に、新しいセッションの場合には、あなたは変数を設定します:

$_SESSION['user'] = 'someuser'; 

クライアントがその情報を見ることはありません。悪意のあるユーザが他のユーザのsession_idを盗むとき


問題

セキュリティ上の問題が生じる可能性があります。何らかのチェックがなければ、彼はそのユーザーを偽装することが自由になります。クライアント(ユーザーではない)を一意に識別する方法を見つける必要があります。

1つの戦略(最も効果的)は、セッションを開始したクライアントのIPがセッションを使用している人のIPと同じであるかどうかを確認することです。

if(logging_in()) { 
    $_SESSION['user'] = 'someuser'; 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} 

// The Check on subsequent load 
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) { 
    die('Session MAY have been hijacked'); 
} 

その戦略の問題は、クライアントは、ユーザが動的IPを持っている(長時間のセッションで)ロードバランサを使用する場合、または、それが偽の警告をトリガすることです。

別の戦略は、クライアントのユーザーエージェントをチェックする必要:

if(logging_in()) { 
    $_SESSION['user'] = 'someuser'; 
    $_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT']; 
} 

// The Check on subsequent load 
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) { 
    die('Session MAY have been hijacked'); 
} 

その戦略の欠点は、(いくつかは、ユーザーエージェントに追加されます)クライアントのアップグレードならば、それはブラウザのか、アドオンをインストールすることで、ユーザーエージェント文字列が変更され、誤ったアラートが発生します。

もう1つの戦略は、5つの要求ごとにsession_idをローテーションすることです。そのようにして、理論的には、session_idはハイジャックされるほど長く滞在しません。

if(logging_in()) { 
    $_SESSION['user'] = 'someuser'; 
    $_SESSION['count'] = 5; 
} 

// The Check on subsequent load 
if(($_SESSION['count'] -= 1) == 0) { 
    session_regenerate_id(); 
    $_SESSION['count'] = 5; 
} 

これらの戦略をそれぞれ希望通りに組み合わせることはできますが、下側を組み合わせることもできます。

残念ながら、解決策はありません。あなたのsession_idが侵害された場合、あなたはかなりお手伝いします。上記の戦略は、ストップギャップ対策にすぎません。

+0

+1詳細................... – Aziz

+0

あなたは[あなたの[他の回答]にリンクしている可能性があります(http://stackoverflow.com/a/1225668/283366) )コピー/貼り付けの代わりに – Phil

+0

@Phil:元の質問で、重複としてマークしました。ここのユーザーは回答を探していましたが、私もそれを提供しました。 –

0

私の意見では、パスワードが必要なデータベースにアクセスする必要がない限り、パスワードは十分安全です。あなたがSQLインジェクションの脆弱性に気づく必要がある何かにアクセスするためにそのユーザーIDを格納しようとしているなら、あなたはこれらを知っていると思います。

あなたが言及したような条件のためにそれを使用するだけで十分に安全です。私が使ったことはよくあります。

関連する問題