1

シンプルなフォルム

<form name="blabla" action="path.php" >bla bla bla </form>

もちろん、フォームアクションへのパスは表示されますが、他のフォームを保護するには、別のWebサーバーからフォームアクションにアクセスできます。

誰かが別の場所からこのフォームアクションを使用して私のデータベースに新しいレコードを挿入したためです。

どうすればそれを保護できますか?

4

4 に答える 4

1

セッションを使用する - フォーム ページでランダムな値を生成し、その値を隠しフィールドに入れて $_SESSION に保存します。フォームの送信時に、フォームの値がセッション データの値と一致することを確認します。これはCSRFにも役立ちます(完全ではありませんが)

$_SERVER['HTTP_REFERER'] 値を使用することもできます。これは必須のヘッダーではなく、一部のブラウザーは完全に有効な使用法で送信しないため (悪意のあるユーザーによって簡単にスプーフィングされます)、完全に確実というわけではありません。

于 2012-09-28T15:05:43.383 に答える
1

投稿があなたのウェブサイトからのものであることを(どういうわけか)確認することをお勧めします。

Cookie、セッション、またはその他の方法を使用して確認します (ページ リファラーのチェックなど [常に信頼できるとは限りません])。

于 2012-09-28T14:58:57.623 に答える
0

通常、このガイドで言及されているように $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>
于 2012-09-28T15:28:27.097 に答える
0

次の PHP スーパーグローバルで設定されている http ホスト ヘッダーをテストできます。

$_SERVER['HTTP_HOST'];

...しかし、ヘッダーはクライアントで偽造できます。

あなたが実際に求めているのは、クロスサイト リクエスト フォージェリ保護です。これには、通常、フォーム データにセキュリティ トークンを挿入することが含まれます。これは、サーバー上のユーザー用に保存したトークン (セッション データなど) と比較されます。

Symfony2 の優れたフォーム API はこれを無料で行います。これを行うためのライブラリもあり、自分で作成することもできます。何にでも合います。

http://www.serversidemagazine.com/php/php-security-measures-against-csrf-attacks/

于 2012-09-28T15:05:49.437 に答える