2009-04-15 18 views
2

私はウェブサイト上で作業しており、ユーザーのログインとセッションを作成したいと考えています。セッションが存在するかどうかを確認する最も安全な方法は何ですか(クッキーやセッション変数のチェックなど)か、PHPのセッションを使用する方が良いでしょうか?ここで最も安全な方法は、PHPでセッションを作成する

答えて

8

session_id()戻りトンです現在のセッションのセッションID、または現在のセッションがない場合は空の文字列( "")です(現在のセッションIDは存在しません)。

http://de.php.net/manual/en/function.session-id.php

が、セッションがアクティブであるかどうかだけを示していますこと。

ほとんどの場合、私はちょうどsession_start();(ユーザーがログインしていなくても)のすべてのスクリプトの冒頭に呼び出します。ログイン時には、ユーザIDまたはユーザオブジェクトで$_SESSION['user']を設定します。ログアウト時には、私はただunset($_SESSION['user']);です。 empty($_SESSION['user'])をチェックして、誰かがまだログインしているかどうかを確認できます。あなたのセッション中の他の場所にユーザ依存の情報を保存している場合は、これをしないでください。そうしないと、ログインしている次のユーザーは、彼が見るはずの情報を得ることができます(この場合はsession_destroy();を使います)。

でも安全ですか? GET/POST url rewrites(クッキーのみ)によるセッションIDの伝播を無効にするだけで、キャッシュされたり他の人に配布されることはありません(この場合、セッションハイジャックが可能です)。 php.iniにsession.use_only_cookiesを設定することでそれを行うことができます。

信頼できない共有サーバーや誤って構成された共有サーバーをホストしている場合、同じマシン上の他のユーザーがセッションデータを読み取る可能性があります。この場合、セッションハンドラを書き換えてセッションデータをデータベースに格納することができます。 intertubesでsession handler mysqlを検索するだけで、準備ができているソリューションがあると確信しています。パスワードのような機密情報をセッションに保存しないで、比較する必要があるたびにクエリを実行する方がよいでしょう。

以外のもの...ログインとユーザー管理にssl/httpsを使用するため、平文パスワードは転送されません。データベースにsaltでpw-hashのみを保存します。パスワードを誰にも見せないようにする(意味:htmlや電子メールには決して印刷しない)。ユーザーが見ることができる(したがって推測する)IDにauto_increment値を使用しないでください。それはすでに質問の範囲外です。

+0

'とパスワードのような機密情報をセッションに保存しないでください。それを比較する必要があるたびにクエリを実行してください。 - まあ、パスワードの片方向暗号化バージョン(md5 +ハッシュ)を保存する方が速いと思って、代わりに照会をdbに再作成して、もう一度 – Strae

+0

をtrueにしてください。通常はチェックする必要はありません#1:ログインのみ、#2:パスワード変更(現在のパスワードを入力して新しいパスワードを設定するように要求した場合) #1の場合データベースを照会しなければならず、#2は頻繁に行われることはないので、追加のオーバーヘッドはごくわずかです。 – stefs

関連する問題