2

私が取り組んでいるコードで私が抱えているこの小さな問題を誰かが助けてくれることを願っていました。これは単なる趣味のサイトのためのものであり、セキュリティ ホールがあることは承知しています。ユーザーが「remember me」ボックスをチェックすると、ログイン スクリプトと登録ページから呼び出される set_remember_cookies という関数を作成しました。

保護された各ページの関数は、次のことを行います。

  1. 記憶 Cookie が設定されているかどうかを確認します
  2. データベースにクエリを実行して、Cookie 内のハッシュされたユーザー名に関連付けられた User_ID を見つけます。
  3. ユーザー テーブルからその User_ID のパスワードを取得します。
  4. remember_cookies テーブルからソルトを取得します
  5. パスワード + ソルトをハッシュし、Cookie 内のハッシュされたパスワードと照合します

繰り返しになりますが、ハッシュ化されたパスワードを Cookie に保存することさえ安全ではないことはわかっていますが、今は心配していません。

私の問題は、以下に含めた set_remember_cookies 関数が実際には Cookie を設定していないことです。保護されたページでは、最初のステップ (Cookie が存在するかどうかの確認) が失敗します。また、ブラウザーで Cookie を確認しましたが、保存されていません。

この関数が Cookie を設定しない理由を誰かに説明してもらえますか? エラーは見つかりませんが、誰かができることを願っています! ありがとう!

    <?php
      function set_remember_cookies($uid, $identifier, $password) {
          mysql_query("DELETE FROM remember_cookies WHERE User_ID = '$uid'"); //Delete old cookie records
          $salt = sha1(uniqid(time() . $_SERVER['HTTP_REFERER']));
          $username_hash = hash("sha256", $identifier . $salt); //Hash the username
          if (mysql_query("INSERT INTO remember_cookies (User_ID, Username_Hash, Salt) VALUES ('$uid', '$username_hash', '$salt')")) {
              setcookie("Username", $username_hash, 60*60*24*365);
              setcookie("Password", hash("sha512", $password . $salt), 60*60*24*365);
          }
      }
    ?>
4

2 に答える 2

7

あなたの Cookie は 1971 年に期限切れになりました。1年後のオフセットが必要なようですので、試してみてください

 setcookie("Username", $username_hash, time() + 60*60*24*365);

3番目のパラメータは「今」からのオフセットではなく、Unixエポックの開始からのオフセットです-かなり細かいマニュアルがこれを明確にしています:)

于 2013-07-17T23:07:04.200 に答える
1

setcookie(name, $value, $expire) ;

マニュアルによると:有効期限を time() に追加する必要があります

Cookie の有効期限が切れる時間。これは Unix タイムスタンプなので、エポックからの秒数です。つまり、おそらく time() 関数に有効期限が切れるまでの秒数を加えて設定します。または、mktime() を使用することもできます。time()+60*60*24*30 は、Cookie が 30 日で期限切れになるように設定します。0 に設定するか省略した場合、Cookie はセッションの終了時 (ブラウザーが閉じるとき) に期限切れになります。

于 2013-07-17T23:07:56.960 に答える