0

ログインフォームにCSRF保護を実装するのに問題があります。ログインの一般的なフローは次のとおりです。

これは、ログインページの上部に含まれています。

// Create CSRF token
$token = $auth->random(64); // 64 psuedorandom characters from /dev/urandom
$_SESSION['token'] = $token;

ログインフォーム:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<input type="submit" name="login" value="Login" />
</form>

そして最後に、フォームがページのさらに下に送信されると、次のようになります。

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

    // Bind input to variables
    $username = isset($_POST['username']) ? $_POST['username'] : '';
    $password = isset($_POST['password']) ? $_POST['password'] : '';
    $posttoken = isset($_POST['token']) ? $_POST['token'] : '';

    // Attempt to login
    $auth->login($username, $password, $posttoken);

}

$ auth-> loginが入力を受信すると、問題が発生します。$ _SESSIONトークンは生成されたトークンと同じですが、$ _ POSTトークンは、最後の送信時に$_SESSIONトークンがあったものと同じです。

$ auth-> loginからのvar_dumpsの例:

最初にvar_dumpを送信します。

$_SESSION Array
[token] => 00a28586a1a89b30149ef130ca6f3c01a25435ad1b0ad1a19326205c75b80d79

$_POST Array
[username] => 
[password] => 
[token] => 2200bb8663f19d66639a7f4791ddb53c9d510802d0ed76c42ac8b3f6d9e1589a
[login] => Login

2番目の送信var_dump:

$_SESSION Array
[token] => e093e312b379d766d46083d616fa8655f1565dc19ed6b1f73108546cb5f43fce

$_POST Array
[username] => 
[password] => 
[token] => 00a28586a1a89b30149ef130ca6f3c01a25435ad1b0ad1a19326205c75b80d79
[login] => Login

3番目の送信var_dump:

$_SESSION Array
[token] => 8be7ecbdae6274d1ba5ce9e8ace0af7c76e3e7d181c507d3da9b8c35652865cc

$_POST Array
[username] => 
[password] => 
[token] => e093e312b379d766d46083d616fa8655f1565dc19ed6b1f73108546cb5f43fce
[login] => Login

注意深く見ると、$ _ POSTトークンが単純に下にシフトしていることがわかります。つまり、最後の送信時の$_SESSIONになります。

$tokenとはページの上部に1回だけ設定されているため、混乱し$_SESSION['token']ました。ユーザーが[送信]をクリックしても違いはありません。

要約すると、$ _ SESSIONには現在生成されたトークンが含まれ、$_POSTには以前に生成されたトークンが含まれます。

何か案は?ありがとうございました!

4

1 に答える 1

1

問題は、ログイン処理コードの前にセッショントークンが変更されていることです。ログイン処理コードの後に​​発生するように、トークン生成ビットを移動する必要があります。

于 2012-07-08T07:08:45.973 に答える