2011-10-24 9 views
2

私はフォーラムを構築しており、クッキーを設定するベストプラクティスについてはわかりません。PHPとサイトのセキュリティでクッキーを設定する

は、ここで私はユーザーとして構築クッキーは、サイトが登録されています。これに代えて

 setCookie($name,$ip,time()+300000,"/"); 

:時間を()+ 300000。私はクッキーを永遠に残しておきたいが、どうやってそれをするか分からない。

また、セキュリティに関する質問があります。クッキーが改ざんされていない、またはハッカーによって設定されていることを確認するにはどうすればよいですか?

もう1つの質問ですが、ユーザーがブラウザでCookieを許可するかどうかを確認するにはどうすればよいですか?

UPDATE:私は、すぐにログインの検証が有効であるとしてこれを置く

:( "/"、$名、$のIP、時間()+ 60 * 60 * 24 * 365) ますsetcookieは、

UPDATE:

 if(!isset($_COOKIE['$name']) 
     { 
      $salt="[email protected]"; 
      $hash = SHA2(salt + $_POST['pass']); 
      setCookie($name,$hash,time()+60*60*24*365*50,"/"); 
     } 
+0

技術的には、そのページが少なくとも83時間ごとに1回呼び出される限り、そのページはすべてのページ呼び出しでリセットされ、更新されるため、そのCookieは永遠に持続します。期間を長くすると有効期限が長くなります。 – CD001

+0

が該当しません。私がそれを設定したのは、ユーザが一度登録しただけなので、 – Matrix001

+0

ああ - もし$ ipがユーザのIPアドレスを参照してそれらを識別していれば、それは現実にはうまくいかないでしょう。 IPアドレスは、長期的には識別子として機能するほど静的ではありません。 – CD001

答えて

2

継続時間は、300000ではなく十分大きな数字を使用してください。

time() + 60 * 60 * 24 * 366 * 15は15年間です。

は、サーバー上で(例えば、256ビットのランダムな文字列)秘密 saltを格納し、( SHA-2のような)安全なハッシュ関数を使用し、改ざんを防ぐ hash = SHA2(salt + data)を計算し、 hashを保持しているクッキーを設定します。

ここで、クッキーを読むときは、hashの値が正しいことを確認するだけです。

+0

それはサーバーに負担をかけることはありませんか?ハッシュ? – Matrix001

+0

クッキー検証自体はそれほどではありません。 1日あたり何人のユーザーが話していますか? – Dennis

+0

lol..私は1000sを望んでいますが、それ以上のものは期待していません – Matrix001

1

あなたはが今までのCookieを設定することはできませんが、非常に長い時間のためにそれを設定して、いつでもユーザーにサイトを訪問しているが、それを更新することができます。

2番目の部分に:クッキーの値をデータベースに追加保存し、一致する場合は誰かが何かを操作しようとしていない場合は設定します。

別のオプションは、Cookieに識別子とデータベースの値のみを格納することです。しかし、注意して、誰もそれらの識別子を推測できないようにしてください。

ところで:

それは次のとおりです。ほとんどの人は:-D

UPDATE毎日新しい永遠のクッキーが必要になりますbeacause私は、ユーザーのIPは、永遠に彼のクッキーに保存されなければならないと思います識別のためにユーザーのIPを使用するのは良くありません、それは毎日変わります。 これは次のようになります。 データベース内のすべてのユーザーの塩を保存します。 "jfdklsjfdsohfdsughfdjkhg"のようにランダムに生成します。ユーザーが保存したクッキー"LoggedIn"に値md5($username.$salt)を追加した場合は、クッキーにユーザーIDを保存します。あなたがクッキーを読んだ場合、あなたはハッシュをmd5(databaseName.databaseHash).と比較するだけでよい。等しい場合、クッキーは良い。このシステムでは、塩分が十分に保護されていることを確認する必要があります(システムだけが知っている必要があります)。

if(isset($_COOKIE["LoggedIn")) 
{ 
    $userid = $_COOKIE["UserId"] // Second cookie, not hashed to know the user's id 
    //get Values from Database here => $database_name, $database_salt 
    if(md5($database_name.$database_salt) == $_COOKIE["LoggedIn"]) 
    { 
     //OK 
    } 
} 
+0

よく、ユーザーが移動するすべてのページでその検証を行いますか? – Matrix001

+0

多くのパワーを必要とするなら、少なくとも単純なチェックサムを比較することはできますが、md5は最近は多くのパワーを必要としません。そして、はい、毎回訪れてください。最も簡単な方法は、クッキーを設定/読み込み、データベースをチェック/更新する独自の読み取り/書き込みクッキー機能を作成することです。 – Tokk

+0

私の答えで更新を見てください。これは正しいです? – Matrix001

1

クッキーはこの方法です。彼らは誰でも変更することができます。 Sessionsを使用すると、より安全にすることができます。また、Cookieの値が変更されていないことを確認するたびにCookieの値を確認することもできます。

また、暗号化することもできますが、クッキーには文字数制限があり、暗号化によって暗号化が拡大されるため、大きな解決策ではありません。

「永続的なクッキー」については、50年を期限切れにすることができます。

+0

これはこれを行う方法ですか?:setCookie($ name、$ ip、time()+ 60 * 60 * 24 * 365 * 50、 "/");ユーザーがログインするたびに、このステートメントを何度も使用することができます。別のCookieが追加されますか?または既存のものを上書きします – Matrix001

+0

整数のサイズはプラットフォームによって異なります。 32ビットの整数では、Cookieを過去50年に設定することはできません。 – Dennis

+0

大丈夫、私は5年に設定しました – Matrix001

0

永遠にクッキーを設定することはできません。クッキーの有効期限を長く設定することができます。 データベースまたはセッションにデータを保存し、一致させてください。 Cookieを使用するよりもセッションを使用することをお勧めします。セッションデータは変更できません。

+0

私の答えで更新を見てください。これは正しいです? – Matrix001

関連する問題