2017-11-10 17 views
0

このトピックに関する質問がありましたが、解決策が見つからないようです。私のインデックスページで、一番上に私は単にCSRF処理時のトークンの検証

<?php 
session_start(); 

function generate_secure_token($length = 16) { 
    return bin2hex(openssl_random_pseudo_bytes($length)); 
} 

$_SESSION['token'] = generate_secure_token(); 
$token = $_SESSION['token']; 

?> 

やっている私はその後、私のフォーム内の隠しフィールドとして$tokenを設定します。私の質問は、フォームの処理に関するものです。現時点で私は持っています

if (empty($_POST[ 'csrf_token' ])) 
{ 
    $errors['token'] = 'Something went wrong'; 
} 

したがって、単にトークンが存在することを確認します。これで十分ですか?私はトークンを作り直してセッショントークンと比較する他の例を見てきましたが、これが必要かどうかわかりません。

これを正しく検証する方法についてのアドバイスはありがたいです。

おかげ

+2

を_「この十分ですか?」_いいえ、あなたはそれをチェックする必要がありますユーザーがPOSTしたトークンは、前に作成したトークンと一致します。さもなければ、ユーザーはちょうどトークンとしてそれを使用する目的をちょっと敗北させるどんな詐欺も送ることができます。 –

+0

私は[OWASP CSRFチートシート](https://www.owasp.org/index.php/CrossSite_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)を読んでから、[CSRFProtector](https: //www.owasp.org/index.php/CSRFProtector_Project) – heavyd

答えて

1

あなたは、導入されたトークンが有効であることを確認するためにあなたのセッショントークンに与えられたトークンを比較する必要があります。

if (empty($_POST[ 'csrf_token' ]) || 
    $_POST[ 'csrf_token' ] != $_SESSION['token']) 
{ 
    $errors['token'] = 'Something went wrong'; 
} 
+1

タイミング攻撃に対して脆弱です。 – PeeHaa

+0

CSRFソリューションの隠しフィールド比較サーバー側を実装した後、同じURLで新しいタブを開くと隠されたフィールドがnullになります。サーバー側の条件はCSRFの隠しフィールドがnullの場合、その攻撃です。 – Rudra

関連する問題