0
我在登錄表單上實施CSRF保護時遇到了一些麻煩。這裏是登錄的一般流程:發佈舊令牌的反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- var_dumps>登錄:
首先提交的var_dump:
$_SESSION Array
[token] => 00a28586a1a89b30149ef130ca6f3c01a25435ad1b0ad1a19326205c75b80d79
$_POST Array
[username] =>
[password] =>
[token] => 2200bb8663f19d66639a7f4791ddb53c9d510802d0ed76c42ac8b3f6d9e1589a
[login] => Login
二提交的var_dump:
$_SESSION Array
[token] => e093e312b379d766d46083d616fa8655f1565dc19ed6b1f73108546cb5f43fce
$_POST Array
[username] =>
[password] =>
[token] => 00a28586a1a89b30149ef130ca6f3c01a25435ad1b0ad1a19326205c75b80d79
[login] => Login
三提交的var_dump:
$_SESSION Array
[token] => 8be7ecbdae6274d1ba5ce9e8ace0af7c76e3e7d181c507d3da9b8c35652865cc
$_POST Array
[username] =>
[password] =>
[token] => e093e312b379d766d46083d616fa8655f1565dc19ed6b1f73108546cb5f43fce
[login] => Login
如果你看仔細看,$ _POST令牌只是向下移動 - 成爲最後一次提交過程中的$ _SESSION。
它讓我感到困惑,因爲$token
和$_SESSION['token']
只在頁面頂部設置一次 - 當用戶單擊提交時它們不應該不同。
總而言之,$ _SESSION包含當前生成的標記,$ _POST包含先前生成的標記。
任何想法?謝謝!
好像是這樣的問題: '<形式行動= 「<?PHP的echo $ _ SERVER [ 'PHP_SELF'];>」 方法= 「郵報」>' 當提交頁面時,生成一個新的標記並將其添加到'$ _SESSION'中,而舊的標記則在'$ _POST'中傳遞,導致匹配失敗。 我還沒有找到解決方法,同時仍然使用每個請求令牌並保持窗體和PHP在同一頁面上處理它。 – ssh2ksh 2012-07-08 19:26:42
我收回它!解決方案是將登錄處理代碼放置在頁面的頂部,令牌生成代碼在其下方,最後是底部的表單。最初你的解決方案不起作用,因爲處理程序仍然在表單之下。公認! – ssh2ksh 2012-07-08 19:38:45
很高興,我努力回答這個問題,因爲我在iPad上。否則會提供更多信息。 – Dale 2012-07-09 16:53:31