実際には、情報を収集して続行するログインフォームがあります。
ここで、サーバーから提供されたこのログインページからのリクエストのみを楽しませ、同じパラメーターで私の URL にヒットする他のページは受けないようにしたいと考えています。
事前の啓発に感謝します。
開発環境が何であれ、最も簡単な方法は、ログインが送信されたときにセッション変数を設定し、サーブレットにその特定の値をチェックさせることです。
ログインフォームページにある種のワンタイムチケットを発行し、後でフォーム送信が送信されたときにそれを確認できます。
簡単な例は、ログイン ページ リクエストでセッションにフラグを設定することです。後でフォームが送信されたときに、フラグが設定されているかどうかを確認します。設定されている場合は、処理を許可し、再度使用できないように設定を解除します。
これは、ログインフォームを送信する前に強制的にリクエストするだけであることに注意してください。ただし、自動化されたリクエストやクロスサイト リクエスト フォージェリ攻撃などの攻撃を防ぐことはできません。
ログインページで:
<input type='hidden' name='access' value='granted'/>
ログインフォームがリダイレクトするページ
if(isset($_POST)&&($_POST['access']=='granted')){
session_start();
$_SESSION['access']='granted'
}
制御したいすべてのページで(ログインを除く):
if ($_SESSION['access']!='granted'){
die "Request denied!";
}
手っ取り早い解決策は、すべてのフォーム送信を追跡することです。
フォームを含むページを表示すると、データベース テーブルに行が追加されます。
submission_id | token | expire |
次に、(非表示フィールドまたはフォームのアクションに)submission_id を配置したページに入力します。
フォームの投稿を受け取ったら、必要なすべてのチェックを行うことができます (一般的には、submission_id、有効期限ごとに 1 つの送信のみ)。
おそらくもっと良い方法がありますが、このようなものがうまくいくはずです
if ($_SERVER["PHP_SELF"] == 'mydomain.com') {
// do some stuff
} else {
die "requests from external servers are denied!";
}
また、CSRF エクスプロイトとその防止方法についての適切な説明については、次のリンクを確認してください: http://en.wikipedia.org/wiki/Cross-site_request_forgery#Prevention