2009-08-30 53 views
7

クッキー/セッションを使用してログインシステムを作りたいのですが、私はどのようなセキュリティなどがよく分かりません。ログインシステム(PHP)クッキーとセッション

セッションでは、「ログイン」が「はい」に設定されている場合、それを信頼できますか?ユーザーは返品内容を変更できますか?暗号化されたパスワードを保存して、すべてのページで確認するだけですか?

クッキーを使用すると、mysql注射のようなものをチェックする必要がありますか?

これは初心者のように聞こえるかもしれませんが、誰かが私のためにそれを明確にすることができれば、本当に役に立ちます。すべての返信をお寄せいただきありがとうございます!

答えて

7

セッション変数を設定した場合、別のセッションCookieをハイジャックしない限り、ユーザーは直接変更できません。

主に気を付けなければならないことは、共有ホスティングであり、セッションデータは安全ではありません(通常、他のサイトで見ることができます)。

クッキーデータが安全でないことにも注意してください。フォームのデータを信頼してはならないのと同じ方法で信頼するべきではありません。パスワードを持つ

あなたのベストプラクティスは、次のとおりです。

  1. ストアハッシュ形式、好ましくはSHA1(最初の選択肢)またはMD5(2番目の選択肢)で、データベースのパスワード。
  2. ユーザーのパスワードを受け取ったら、暗号化してデータベースに保存されているものと照合します。
  3. ユーザセッションにログインしたユーザ名を設定します。
  4. クッキーを永久に保存するのではなく、一定期間(たとえその日であっても)後にクッキーを期限切れにします。
  5. 可能であれば、安全な接続(HTTPではなくHTTPS)を使用してください。 SSL証明書は安価です。
+0

これは、私は、各ロードされたページで、ユーザーのログイン名とパスワードを確認する必要があることを意味するのでしょうか? パスワードデータベースと暗号化方法を安全​​に保つ最も良い方法は何ですか? –

+1

@Grueいいえ、ログインするときには合理的な無効化ポリシーが必要です。あなたが保護しているものには意味をなさないものがあります(例えば、銀行のウェブサイトには、ビデオにコメントを残すだけの別のセキュリティ上の考慮事項があります)。 – cletus

+3

この回答にはかなり古いものがあります。パスワードのSHA1またはMD5を使用しないでください:http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely –

3

ルール:ユーザー入力を信頼しないでください。クッキーはユーザの入力であり、クッキーに保存されているセッションIDはユーザの入力であり、httpのヘッダはユーザの入力です。これらは可能な限りすべてトリプルチェックされなければなりません。一方、セッションデータはサーバーに格納されているため、/ tmpに格納されていなければ、多かれ少なかれ安全です。

セッション認可の最も一般的な設定の1つは、セッションIDがCookieに保存されており、パスワードを含むすべてがセッションに保存されていることです。 CookieからのIDに基づいてセッションを開始した後、セッションデータからユーザーIDを取得し、そこに格納されているパスワードがまだ有効かどうかを確認する必要があります。

0

任意およびすべてのユーザー入力を精査し、宗教的に消毒する必要があり、それはデータ、CookieデータをGETとPOSTなる。..

セッションVARでログイン状態を保持することは安全である場合は、あなたの質問に答えるために、答えはいです。あなたがどれくらい安全であるかにかかわらず、ユーザーがあなたに送るすべてのものを丁寧に丁寧に覚えておいてください。

5

ここ数人が述べているように、ユーザーの入力を信頼しないでください。あなたの入力、特にユーザ名&のパスワードフィールドをサニタイズすると、SQLインジェクション攻撃を防ぐことができます。

これはすべて役に立ちます&聖職者はクッキーにユーザー名やパスワードを保存していないので、すべての要求に応じてサーバーに&が送信され、ストリームを見ているユーザーはそのデータを取得できます。大きなトラブルで。

は、ここでは、セッションで読むべきカップルの記事だ、セキュリティ、およびハッシュ - ちょうどSHA1またはMD5のパスワードをハッシュ化は、彼らがさらに強固だので、それらを塩、十分ではありません。たとえあなたが何事もそれを壊すことがあっても、不可避なことはありません。あなたの仕事は、できるだけ休憩/活用するのが難しいようにすることです。あなたのサイトに侵入に関与

より多くの仕事は、より価値のあるコンテンツは努力の価値があることがあります。あなたの仕事は、悪意のあるユーザーを阻止することです。

この記事は、あなたの訪問者のためのユニークなフィンガープリントを作成するためのいくつかの素晴らしい情報を持っているセッションハイジャックをより困難にするのに役立ちます - PHP Security Guide: Sessions

&塩漬け技術をハッシュ基本的なパスワードを使用して、この記事のお得な情報を - Password Hashing

これはです決して終わりを意味するものではない&すべて - あなたはセキュリティなどの仕事をすることができますが、彼らは良い出発点です。誰かがここでは、より高度な/より高度な記事を指している可能性がありますが、私は個人的に私のコードを上手に役立つこれらを発見しました。

2

3つの変数を格納することをお勧めします。 1つはログインしている場合、1つはユーザー名用、もう1つはランダムに生成されたハッシュ用です(ログイン時に生成され、他のユーザー情報とともにデータベースに格納されます)。こうすることで、ユーザー名がCookieに保存されている場合は、そのユーザーのCookieに保存されているユーザー名が変更されます。

例:Cookieデータは次のようになります。 logged_in = true; user = 'admin'; sessionid = [無作為に生成されたID(通常は私が作成したランダムに生成された単語)]

ログインするたびに、新しいセッションIDが生成され、データベースのそれ自身のフィールドに格納されます。今、私が自分のクッキー情報を変更して、ユーザー変数を変更して 'ユーザー'(これはハイジャックしようとしている別のユーザーになります)と言えるでしょうか。セッションIDは2番目のユーザーのセッションIDと一致しなくなり、ログインは拒否されます。ここで

は、私は数週間前に働いていたCIプロジェクトから盗んだ簡単な例です:

function logged(){ 
$logged_in = $this->session->userdata('logged_in'); 
if($logged_in){ 
    $userid = $this->session->userdata('userid'); 
    $sessionhash = $this->session->userdata('hash'); 

    $this->db->where('id', $userid); 
    $this->db->where('hash', $sessionhash); 
    $query = $this->db->get('members'); 

    if($query->num_rows == 1){ 
    return TRUE; 
    }else{ 
    return FALSE; 
    } 
} 
} 
関連する問題