質問
私は PHP でログイン スクリプトを作成している初心者です。これは私がこれまでに持っているフォームトークンステートメントです。
$_SESSION["form_token"] = md5(rand(time (), true)) ;
このステートメントは、ユーザーがログインしたいことを示した直後に発行されます。
私の限られた理解では、トークンの目的は、一意の時点で一意のユーザーを識別し、フォーム トークン情報を偽装することです。
そうなると、すべてが曖昧になってしまいます。これが私の 3 つの未解決の質問です。
セキュリティ目的でフォーム トークンを「チェック」するのに最適な時期はいつですか?
どうやって確認すればいいですか?
フォーム トークンを「破棄」する場合、いつ行うのでしょうか?(いや、ユーザーがログアウトするまでフォーム トークンは「アクティブ」のままでしょうか?
解決
あなたが試みていることを行う必要はありません。PHP で session_start() を使用してセッションを開始すると、一意の SESSIONID がすでに生成されています。あなたがすべき ない これをフォームに入力します。デフォルトでは Cookie を介して処理されます。SESSIONID を確認する必要もありません。これも自動的に処理されます。
ユーザーを認証し、認証された ID を保存する責任はあなたにあります (例:$_SESSION['user_id'] = SESSION 内の $userId。ユーザーがログアウトした場合は、session_destroy を使用してそのセッションを破棄します。
session_start() が次のいずれかであることを確認する必要があります。 初め サイト内のすべてのページに必要なもの。
基本的な例を次に示します。
<?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/ >