シンプルなフォルム
<form name="blabla" action="path.php" >bla bla bla </form>
もちろん、フォームアクションへのパスは表示されますが、他のフォームを保護するには、別のWebサーバーからフォームアクションにアクセスできます。
誰かが別の場所からこのフォームアクションを使用して私のデータベースに新しいレコードを挿入したためです。
どうすればそれを保護できますか?
セッションを使用する - フォーム ページでランダムな値を生成し、その値を隠しフィールドに入れて $_SESSION に保存します。フォームの送信時に、フォームの値がセッション データの値と一致することを確認します。これはCSRFにも役立ちます(完全ではありませんが)
$_SERVER['HTTP_REFERER'] 値を使用することもできます。これは必須のヘッダーではなく、一部のブラウザーは完全に有効な使用法で送信しないため (悪意のあるユーザーによって簡単にスプーフィングされます)、完全に確実というわけではありません。
投稿があなたのウェブサイトからのものであることを(どういうわけか)確認することをお勧めします。
Cookie、セッション、またはその他の方法を使用して確認します (ページ リファラーのチェックなど [常に信頼できるとは限りません])。
通常、このガイドで言及されているように $token 値を追加します。
例えば:
<?php #your validator
start_session();
if(isset($_POST['foo']...isset($_POST['bar']){#Required Sent Values
if(isset($_SESSION['token']) && $_POST['token'] === $_SESSION['token']){#Check Token
#Check If Things Are Valid
}else{
#Error
}
}
?>
<?php #Your form page
$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;
?>
<form action="">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
</form>
次の PHP スーパーグローバルで設定されている http ホスト ヘッダーをテストできます。
$_SERVER['HTTP_HOST'];
...しかし、ヘッダーはクライアントで偽造できます。
あなたが実際に求めているのは、クロスサイト リクエスト フォージェリ保護です。これには、通常、フォーム データにセキュリティ トークンを挿入することが含まれます。これは、サーバー上のユーザー用に保存したトークン (セッション データなど) と比較されます。
Symfony2 の優れたフォーム API はこれを無料で行います。これを行うためのライブラリもあり、自分で作成することもできます。何にでも合います。
http://www.serversidemagazine.com/php/php-security-measures-against-csrf-attacks/