フォームのなりすましを防止するフォーム ヘルパーを開発しようとしています。だから私はこれを思いついた:
<form...>
<?=form::secure()?>
...
</form>
ユーザーセッションのIDのmd5であるトークンをキー「_token」で隠しフォームにスタンプします(これはランダムで、1週間後に更新されます)。そして、「アクション」URL (フォームから):
$token = (isset($_GET['_token'])) ? $_GET['_token'] : null;
$token = (is_null($token) and isset($_POST['_token'])) ? $_POST['_token'] : $token;
if (form::is_secure($token)) { // checks if the given token is equal to md5(user id)
...ok...
} else {
...error...
}
それはフォームのなりすましを防ぎますか、それとも何か不足していますか? ユーザーがページを読み込んでフォームを送信した直後にユーザー ID の有効期限が切れた場合、エラーが出力され、フォームを再度送信する必要がありますが、これは問題ありません (まれです)。
ここで失敗する可能性がある唯一のことは、潜在的な攻撃者がユーザーのセッション ID を取得でき、そのリクエストに ?_token=id を添付して、ユーザーが参照できるようにすることだと思いましたが、その時点で、攻撃者がユーザー セッション ID を持っている場合、攻撃者はとにかくやりたいことを実行できます。
私は正しいですか?そうでない場合、目標を達成するためにコードを編集するにはどうすればよいですか?