2011-11-04 79 views
0

我創建了腳本。來源 -

控制器 -

public function action_index() { 
     session_start(); 
     $_SESSION['token'] = rand(); 
if (isset($_GET['do']) and $_GET['do'] == 'comment') {//Ja viss kārtībā, turpinam 
      var_dump($_POST['token']); 
      var_dump($_SESSION['token']); 
      if ($_SESSION['token'] == $_POST['token']) { 
echo 'ok'; 
} 
else{ echo 'error'; } 

視圖 -

<form action="?do=comment" class="form-komentaram" method="post" style="margin: 7.5px;"> 
    <input type="text" name="name" required="required" placeholder="Tavs vārds..." /><br /> 
    <input type="text" name="homepage" placeholder="Tava mājaslapa..." /><br /> 
    <input type="hidden" name="artcl_id" value="<?php echo $article['id']; ?>" /> 
    <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" /> 
    <textarea name="text" required="required"></textarea><br /> 
    <input type="submit" value="OK!" required="required" /> 
</form> 

隨着我的var_dump看到,在頁面加載$ _SESSION [ '令牌']的變化。 例如,我在輸入字段中提交標記並重新加載頁面以檢查標記,但在頁面重新加載之前$ _SESSION ['token']爲23456,$ _POST ['token']爲23456,但在頁面重新加載$ ​​_SESSION [令牌']是12345.爲什麼?

+0

由於'$ _SESSION ['token'] = rand();'可能 – Clive

回答

1

根據您發佈的代碼,每次調用action_index()時,$ _SESSION ['token']將被替換爲一個新值。應該這樣做:

if (!array_key_exists('token', $_SESSION)) { 
    $_SESSION['token'] = rand(); 
} 

隨後的所有調用action_index()不會讓你覆蓋會話令牌值。

+0

非常感謝! :) – reGative

1

因爲每次加載頁面時都要爲它指定一個隨機值。

 $_SESSION['token'] = rand(); 

然後,您將它作爲隱藏輸入來回應。 「/>

所以,下次你提交表單時它會回送的值

如果你想一次給它的會話,然後執行:

if (!$_SESSION['token']) { 
    $_SESSION['token'] = rand(); 
} 
+0

非常感謝! :) – reGative

0
$_SESSION['token'] = rand(); 

您明確更改的$_SESION['token']值。

0
$_SESSION['token'] = rand(); 

非常第一款T你在使用會話的時候這樣做是把$_SESSION['token']設置爲一個隨機值。所以每次使用代碼時,值都會有所不同。 (或者,至少,是非常可能是不同的。)

你可能需要分配一個隨機值之前檢查的值,或分配隨機值時,會在代碼的其他地方,而不是開始在每個頁面加載。

相關問題