私はPHPのログインスクリプトに取り組んでいる初心者です。これは私がこれまでに持っているフォームトークンステートメントです:
$_SESSION["form_token"] = md5(Rand(time (), true)) ;
このステートメントは、ユーザーがログインを希望していることを示した直後に発行されます。
私の限られた理解は、トークンの目的は、一意の時点で一意のユーザーを識別し、フォームトークン情報を偽装することであるということです。
その後、すべてがあいまいになります。これが私の3つの未解決の質問です:
セキュリティの目的でフォームトークンを「チェック」するのに最適な時期はいつですか。
どうすれば確認できますか?
フォームトークンを「破棄」するのはいつですか。 (IOW、ユーザーがログアウトするまでフォームトークンは「アクティブ」のままですか?
あなたがしようとしていることをする必要はありません。 PHP with session_start()でセッションを開始すると、一意のSESSIONIDが既に生成されています。notこれをフォームに入力します。デフォルトではCookieを介して処理されます。また、SESSIONIDを確認する必要もありません。これも、自動的に処理されます。
ユーザーを認証し、認証されたIDを保存する責任があります(例:SESSIONに$ _SESSION ['user_id'] = $ userId。ユーザーがログアウトすると、session_destroyでセッションが破棄されます。
Session_start()がサイトのすべてのページのfirstのものの1つであることを確認する必要があります。
基本的な例を次に示します。
<?php
session_start(); // starts new or resumes existing session
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking
function login($username, $password)
{
$user = new User();
if ($user->login($username, $password)) {
$_SESSION['user_id'] = $user->getId();
return true;
}
return false;
}
function logout()
{
session_destroy();
}
function isLoggedIn()
{
return isset($_SESSION['user_id']);
}
function generateFormHash($salt)
{
$hash = md5(mt_Rand(1,1000000) . $salt);
$_SESSION['csrf_hash'] = $hash
return $hash;
}
function isValidFormHash($hash)
{
return $_SESSION['csrf_hash'] === $hash;
}
編集:私は元の質問を誤解しました。フォームハッシュを生成および検証するために、上記の関連するメソッドを追加しました。
次のリソースを参照してください。
これはCSRF攻撃を防ぐためです
http://en.wikipedia.org/wiki/Cross-site_request_forgery
悪意のあるサイトは、理論的にはアプリケーションに投稿するフォームを表示する可能性があります。フォームには、データ侵害や不要なアクションを引き起こす指示が含まれている場合があります。ユーザーはすでにログインしているため、アプリが受け入れるフォームの送信にだまされる可能性があります。フォームトークンは、フォームが他のサイトではなく、自分のサイトによって作成されたことを保証します。
多くの場合、HTTP_REFERERをチェックするだけで十分ですが、完全な解決策ではありません(たとえば、httpsはリファラー文字列を送信しません)。
本当にすべてのフォームをトークンで保護したい場合は、emitToken()やcheckToken()などの便利な関数を作成して、サイト全体で機能させることができます。
いくつかの例:
Zendフレームワークの実装を確認できます。
特定の実装とは別に、ドキュメントでは、フォームでのこの種の要素の理由と使用法について説明しています。
そのZend_Form_Element_Hash https://docs.zendframework.com/zend-form/element/csrf/