0

私は CSRF に関する多くの記事を読みましたが、それらのほとんどすべてが非表示のトークンである同じ解決策を持っているため、CSRF を防止するコードを書き、その後自分のページをハッキングしようとしましたが、うまくいきませんでした。私のコードはCSRF防弾であり、とにかくその周りにある場合。

フォームが含まれる 4 つのページがあるため、各ページに次のように記述します。

            if (isset($_POST['submit'])){

            // Check for CSRF token
            if ($_SESSION['token'] === $_POST['token']){

                // write to db

            }else{
                 // CSRF attack has been detected
                 die("CSRF :<br>1: $_SESSION[token]  <br> 2: $_POST[token]");

            }

        }else{
            // assign CSRF prevention token
            $form_token = md5((rand(1,89412) * 256 / 4).$date.time());
            $_SESSION['token'] = $form_token;
        }
        ?>
        <form action='' method='post'>
        <input type='hidden' name='token' value='<?echo $form_token;?>'>

この方法は、攻撃者が私の Web サイトで CSRF を使用するのを阻止するのに十分でしょうか?

どうもありがとう。

4

1 に答える 1

0

CSRF 防止のためのコードを示します。

config.php 設定ファイルは、または関数
を使用してすべてのページに自動ロードする必要があります。 ベスト プラクティスは、構成クラスを作成することです (コードを単純化するために関数を書き留めます)。requireinclude

session_start();

if(empty($_SESSION['CSRF'])){
        $_SESSION['CSRF'] = secureRandomToken();
    }

post.php
これは単なる例です。すべての「投稿」ページで、CSRF トークンが設定されているかどうかを確認する必要があります。メソッドを使用してフォームを送信してくださいPOSTSlim Frameworkまたは Laravel Lumenもご覧になることをお勧めします。これらは、「post.php」ページでのみ POST リクエストを非常に簡単に受け入れることができる優れたルーティング システムを提供します (また、自動的にすべての形式の CSRF トークン)。

if (!empty($_POST['CSRF'])) {
    if (!hash_equals($_SESSION['CSRF'], $_POST['CSRF'])) {
        die('CSRF detected.');
    }
}else{
    die('CSRF detected.');
}

view.php
ここで、CSRF セッション値を含む非表示の入力を入れるだけです。

<input type="hidden" name="CSRF" value="<?= $_SESSION['CSRF'] ?>">

この簡単な説明がお役に立てば幸いです:)

于 2017-02-15T09:23:11.743 に答える