[英]Session variable fails, php issue
session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
這就是我開始代碼的方式。
然后,我將taht $ token變量傳遞給以下形式的隱藏字段:
<input type="hidden" name="token" value="<?php echo $token; ?>" />
但是這種條件永遠不會成立:
if($_POST['token'] == $_SESSION['token'])
{
echo 'Session was valid<br/>';
}
為什么?
因為您在檢查令牌之前會重新生成令牌。 確定不相同后,必須進行更改
在頁面提交時,將為會話分配一個新值。
嘗試,
session_start();
if(!isset($_SESSION['token']))
{
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
嘗試將$_SESSION['token']
到表單而不是$token
,以防在令牌創建和表單輸出之間不小心重新分配了它。
當我開發需要花很多時間才能找到的東西時,我曾經遇到過一個與此非常類似的問題,事實證明那是因為我沒有放入<img src=''>
,因為我還沒有圖片-這導致再次請求該頁面,因為空src
表示“此頁面”,因此在加載頁面后重新生成了令牌。
要檢查的另一件事是,表單的action
屬性是否缺失,或者是否有指向自身的值,在提交表單時, if (...)
在if (...)
語句之前重新生成令牌。
您可以執行以下操作,以防止在每次頁面加載時重置令牌:
session_start();
if (!isset($_SESSION['token']))
{
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
但是...您可能會比使用session.referer_check更好,或者使用一些包含更細粒度安全性的開源Session類,而不是將其附加到過程標准之上。 (如果正確完成,則無論您實際使用會話在哪里,您的代碼都不必更改。)有關更多信息,請參見php.net/session_set_save_handler 。
您提供的代碼在一個文件中,然后提交給自己。 會重新生成令牌並分配給會話變量。 正如“ AVD”所說的那樣,是防止重新分配代碼的代碼
session_start();
if(empty($_SESSION['token'])){
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
然后您可以比較要檢查的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.