簡體   English   中英

會話變量失敗,PHP問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM