2011-10-18 83 views
1
session_start(); 
$token = md5(uniqid(rand(), TRUE)); 
$_SESSION['token'] = $token; 

這是我如何開始我的代碼。會話變量失敗,PHP問題

我的話,$令牌變量傳遞taht到一個隱藏字段的形式:

<input type="hidden" name="token" value="<?php echo $token; ?>" /> 

但條件是不正確的:

if($_POST['token'] == $_SESSION['token']) 
{  
     echo 'Session was valid<br/>'; 
} 

爲什麼呢?

+0

當你做比較時,如果不是正確的值,$ _POST ['token']'和'$ _SESSION ['token']'是什麼? – Clive

+0

隱藏字段被稱爲post,並且會話變量被稱爲令牌,而php變量被稱爲令牌。 $ token,應該在它們全部相同 –

+1

也許是因爲每次頁面加載/重新加載時都會生成'$ token',並且在驗證表單數據之前它會被更改? – user973254

回答

2

頁面提交時,會爲該會話分配一個新值。

嘗試,

session_start(); 
if(!isset($_SESSION['token'])) 
{ 
$token = md5(uniqid(rand(), TRUE)); 
$_SESSION['token'] = $token; 
} 
+0

是的,它已經修復了問題 –

1

嘗試呼應$_SESSION['token']到形式,而不是$token,以防意外重新分配它創建令牌和形式輸出之間。

我曾經有一個問題與我很相似,當時我正在開發一些花費我很多時間去尋找的東西,事實證明這是因爲我已經離開了<img src=''>,因爲我還沒有圖像 - 這導致頁面被再次請求,因爲空的src意味着'這個頁面',所以在加載頁面之後重新生成了令牌。

要檢查的另一件事是,如果表單的action屬性丟失或某些指向自身的值,則可能會在if (...)語句前提交表單時重新生成令牌。

+0

非常有幫助。我沒有考慮過這個問題..我認爲這個表格會自我更新 –

3

因爲您在檢查之前重新生成令牌。後請將你確定它不是去改變它同樣

0

,以防止在每個頁面加載重置令牌你可以做這樣的事情:

session_start(); 
if (!isset($_SESSION['token'])) 
{ 
    $token = md5(uniqid(rand(), TRUE)); 
    $_SESSION['token'] = $token; 
} 

但是......你可能會更好的方法是使用session.referer_check,或者使用一些開源的Session類,它包含更好的粒度安全性,而不是在程序標準之上加以解決。 (如果正確完成,您的代碼無需在實際使用會話的任何地方更改)。 有關更多信息,請參閱php.net/session_set_save_handler

0

您提供的代碼位於一個文件中,並將其提交給自己。 重新生成令牌並分配給會話變量。正如「AVD」說是爲了防止重新分配它

session_start(); 
if(empty($_SESSION['token'])){ 
    $token = md5(uniqid(rand(), TRUE)); 
    $_SESSION['token'] = $token; 
} 

那麼你可以比較你的病情,你要去哪裏來檢查代碼。