ホームページ >バックエンド開発 >PHPチュートリアル >PHP ログインは記憶機能を実装します

PHP ログインは記憶機能を実装します

*文
*文オリジナル
2017-12-27 09:36:284036ブラウズ

PHP ログインに記憶機能を実装するにはどうすればよいですか?この記事では、主に PHP の永続ログインと記憶する機能の実装方法とセキュリティの実践について紹介します。この記事では、データベースを使用してより安全な永続ログインと記憶する機能を実装することに焦点を当てます。お役に立てれば幸いです。

永続ログインとは、ブラウザセッション間で継続的に認証を行うメカニズムを指します。つまり、訪問の間にユーザー セッションが期限切れになったとしても、今日ログインしているユーザーは明日も引き続きログインします。永続的なログインが存在すると、認証メカニズムのセキュリティは低下しますが、使いやすさは向上します。ユーザーがアクセスするたびに認証するのが面倒な代わりに、ログインを記憶するオプションを提供します。

私が観察したところによると、最も一般的な欠陥のある永続ログイン スキームは、ユーザー名とパスワードを Cookie に保存するものです。これを実行したくなるのは当然です。ユーザーにユーザー名とパスワードの入力を求める代わりに、Cookie からそれらを読み取るだけで済みます。残りの検証プロセスは通常のログインとまったく同じであるため、このシナリオは単純です。

ただし、ユーザー名とパスワードを Cookie に保存する場合は、この機能をすぐにオフにして、このセクションの残りの部分を読んで、より安全なソリューションを実装するためのアイデアを見つけてください。また、認証情報が漏洩したため、今後この Cookie を使用するすべてのユーザーにパスワードの変更を要求する必要があります。

永久ログインには、認証 Cookie と呼ばれる永久ログイン Cookie が必要です。これは、Cookie が複数のセッションにわたって安定したデータを提供するために使用される唯一の標準メカニズムであるためです。 Cookie が永続的なアクセスを提供する場合、アプリケーションのセキュリティに重大なリスクが生じるため、Cookie に保存したデータが限られた期間のみ認証に使用できるようにする必要があります。

最初のステップは、キャプチャされた永続的なログイン Cookie によってもたらされるリスクを軽減する方法を考案することです。 Cookie のキャプチャは避けたいものですが、特にこのメカニズムにより、すべてが正常に動作している場合でも検証フォームの安全性が低下する可能性があるため、多層防御プロセスを使用することが最善です。この方法では、ユーザーのパスワードなど、永続的なログインを提供する情報に基づいて Cookie を生成することはできません。

ユーザーのパスワードの使用を避けるために、1 回限りの検証にのみ有効な ID を作成できます:

<?php
$token = md5(uniqid(rand(), TRUE));
?>


それをユーザーのセッションに保存して、特定のユーザーに関連付けることができますが、これは役に立ちません複数のセッションにわたってログインを維持することが大前提条件です。したがって、この ID を特定のユーザーに関連付けるには、別の方法を使用する必要があります。

ユーザー名はパスワードよりも機密性が低いため、Cookie に保存できます。これにより、検証プログラムがどのユーザーの ID が提供されたかを確認するのに役立ちます。ただし、より良いアプローチは、推測や発見が難しい 2 番目の ID を使用することです。ユーザー名とパスワードを保存するデータ テーブルに、2 番目の ID (識別子)、永続的なログイン ID (トークン)、および永続的なログイン タイムアウト (タイムアウト) の 3 つのフィールドを追加することを検討してください。

mysql> DESCRIBE users;
+------------+------------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| username  | varchar(25)    |     | PRI |      |    |
| password  | varchar(32)     | YES |   | NULL   |     |
| identifier| varchar(32)     | YES | MUL | NULL  |     |
| token    | varchar(32)    | YES |   | NULL   |    |
| timeout   | int(10) unsigned | YES |    | NULL  |    |
+------------+------------------+------+-----+---------+-------+


セカンダリ ID と永続的なログイン ID を生成して保存することで、ユーザー認証情報を含まない Cookie を作成できます。

<?php
$salt = &#39;SHIFLETT&#39;;
$identifier = md5($salt . md5($username . $salt));
$token = md5(uniqid(rand(), TRUE));
$timeout = time() + 60 * 60 * 24 * 7;
setcookie(&#39;auth&#39;, "$identifier:$token", $timeout);
?>


ユーザーが永久ログイン Cookie を使用する場合、それがいくつかの基準を満たしているかどうかを確認できます。

<?php

/* mysql_connect() */
/* mysql_select_db() */

$clean = array();
$mysql = array();

$now = time();
$salt = &#39;SHIFLETT&#39;;

list($identifier, $token) = explode(&#39;:&#39;, $_COOKIE[&#39;auth&#39;]);

if (ctype_alnum($identifier) && ctype_alnum($token))
{
  $clean[&#39;identifier&#39;] = $identifier;
  $clean[&#39;token&#39;] = $token;
}
else
{
  /* ... */
}

$mysql[&#39;identifier&#39;] = mysql_real_escape_string($clean[&#39;identifier&#39;]);

$sql = "SELECT username, token, timeout
        FROM   users
        WHERE  identifier = &#39;{$mysql[&#39;identifier&#39;]}&#39;";

if ($result = mysql_query($sql))
{
  if (mysql_num_rows($result))
  {
    $record = mysql_fetch_assoc($result);

    if ($clean[&#39;token&#39;] != $record[&#39;token&#39;])
    {
      /* Failed Login (wrong token) */
    }
    elseif ($now > $record[&#39;timeout&#39;])
    {
      /* Failed Login (timeout) */
    }
    elseif ($clean[&#39;identifier&#39;] !=
            md5($salt . md5($record[&#39;username&#39;] . $salt)))
    {
      /* Failed Login (invalid identifier) */
    }
    else
    {
      /* Successful Login */
    }

  }
  else
  {
    /* Failed Login (invalid identifier) */
  }
}
else
{
  /* Error */
}

?>

3 つの側面から永久ログイン Cookie の使用を制限する必要があります。


1. Cookie の有効期限は 1 週間 (またはそれ以内) にする必要があります
2. Cookie は 1 回の検証にのみ使用する必要があります (検証が成功した後に削除または再生成されます)。

3. サーバー側の Cookie を 1 週間 (またはそれ以内) に制限します。 ) の有効期限は

ユーザーを無期限に記憶させたい場合は、ユーザーが有効期限よりも頻繁にアプリにアクセスする限り、各検証後に単純に再生成するだけで、新しい Cookie を識別して設定できます。

もう 1 つの便利な原則は、機密性の高い操作を実行する前にユーザーにパスワードの入力を要求することです。永続的にログインしているユーザーにのみ、特に機密性の低いアプリの機能へのアクセスを許可する必要があります。機密性の高い操作を実行する前に手動で確認するようユーザーに求めることは、かけがえのないステップです。


最後に、システムからログアウトしたユーザーが実際にログアウトしていることを確認する必要があります。これには、永続的なログイン Cookie の削除も含まれます:

<?php
setcookie(&#39;auth&#39;, &#39;DELETED!&#39;, time());
?>

上記の例では、Cookie には役に立たない値が埋め込まれていました。すぐに期限切れになるように設定します。こうすることで、ユーザーの時計が不正確なままで Cookie が有効なままであっても、ユーザーは事実上ログアウトされます。 H 関連する推奨事項: pPhp 上級チュートリアル: PHP Cookies

Php Cookies はユーザーの識別によく使用されます

表示例 PHP トークンの使用と検証

以上がPHP ログインは記憶機能を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。