2017-04-25 49 views
0

非常簡單的設置:加載頁面時,生成一個隨機會話令牌並保存在$ _SESSION [「token」]中。表單在隱藏的輸入字段中包含此標記。在這之前沒有問題。我將表單提交到同一頁面(action =「」),然後嘗試檢查$ _SESSION [「token」]是否等於通過POST發送的令牌。一個變量會相應地改變,然後我再次生成一個新的會話標記,替換舊的$ _SESSION [「標記」]。PHP會話變量無法生存

問題是:在$ _SESSION [「令牌」]再次改變的時刻調用頁面(以前我可以比較Session和POST令牌)因此,兩個標記永遠不會匹配。我無法弄清楚它爲什麼會改變。這不是我寫的代碼行,因爲這些都是執行的,在頁面加載之前再次替換未知來源的隨機標記。

INDEX:

<?php 
session_start(); 
date_default_timezone_set("Europe/Berlin"); 

$BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 

$form_valid = false; 


if (isset($_POST["token"]) && isset($_SESSION["token"])) { 
    if ($_POST["token"] == $_SESSION["token"]) { 
     $form_valid = true; 
    } 
} 

//Set (new) session token 
$token = bin2hex(random_bytes(10)); 
$_SESSION["token"] = $token; 

//Load actual page 
include ("/backend/admin.php"); 
?> 

包含的頁面:

<?php echo "FORM VALID:"; var_dump($form_valid); ?> 
<?php if (!isset($_SESSION["admin"]) || !$_SESSION["admin"]) { ?> 

    <form id="verify" method="POST" action=""> 
     <label>Password</label> 
     <input type="password" name="access"> 
     <input type="hidden" name="token" value="<?= $_SESSION['token'] ?>"> 
     <input type="submit" value="Senden"> 
    </form> 

<?php } else { ?> 

    ... 

<?php } ?> 

任何幫助表示讚賞。謝謝。

回答

0

有你的邏輯有問題,會話令牌更新一次,無論在表單提交時間不,

$token = bin2hex(random_bytes(10)); 
$_SESSION["token"] = $token 

試試這個,

<?php 
    session_start(); 
    date_default_timezone_set("Europe/Berlin"); 

    $BASE_URL = "http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 

    $form_valid = false; 


if(empty($_SESSION["token"])){ 
$_SESSION["token"]= bin2hex(random_bytes(10)); 
} 

    if (isset($_POST["token"]) && isset($_SESSION["token"])) 
{ 
     if ($_POST["token"] == $_SESSION["token"]) { 
      $form_valid = true; 
      unset($_SESSION["token"]); 
     } 
    } 





    include ("/backend/admin.php"); 
    ?> 
+0

好了,所以我想這和它的工作 - 某種方式。說這是因爲雖然它確實解決了問題,但它使用戶無法輸入錯誤的密碼,然後再次嘗試。因爲不管密碼是什麼,令牌都會被取消設置,我將不得不重新加載以獲取新的令牌。 在上面的例子中,我切斷了我實際檢查密碼的部分,對不起。 [1/2] – Hylaze

+1

然而,我仍然不明白爲什麼我的邏輯是有缺陷的。每次加載頁面時獲取新的令牌應該是絕對沒問題的,只要新的令牌在現有的令牌被比較之後設置即可。這正是我所做的,不是嗎? 當它只是一個頁面重新加載 - >誰在乎?沒有令牌比較,你得到一個新的。我看不出這有什麼缺陷。 但如果是,請賜教:/ [2/2] – Hylaze

+0

問題是 $ _ POST [ 「令牌」] - >老的道理, $ _SESSION [ 「令牌」] - >新的令牌, ,因爲一旦用戶點擊提交,頁面將被刷新,並且SESSION會再次更新,留下POST有舊標記。希望這可以幫助 –