2015-02-24 1219 views
2

這是一個簡單的php代碼,它啓動會話並重新生成會話ID並在POST請求中設置cookie生存期。爲什麼在瀏覽器重新打開後這個cookie會改變數值?

<?php 
// url: http://localhost/sessiontest/ 
session_start(); 
if (isset($_POST['test'])) { 
    ini_set('session.cookie_lifetime', 86400); 
    session_regenerate_id(true); 

    header('Location: http://localhost/sessiontest/'); 
    return; 
} 
print_r($_COOKIE); 
?> 
<html> 
    <form method="post" action=""> 
     <input type="text" name="test" /> 
     <input type="submit" /> 
    </form> 
</html> 

我在firefox 35.0.1有問題。會話ID存儲在PHPSESSID Cookie中。會話ID重新生成後,我關閉瀏覽器並打開它。瀏覽器關閉後,Cookie值會更改。 Chrome中沒有這樣的問題。

如果打開這個頁面,你會看到一些值(值#1) PHPSESSID的cookie如果你點擊提交按鈕PHPSESSID cookie將被改變(值#2)

然後,如果你關閉Firefox 35.0.1並重新打開它,您將看到PHPSESSID cookie的值爲#1。爲什麼會發生?這是一個Firefox的錯誤? 如果您在重新打開之後在Chrome中執行相同的操作,您將看到#2的價值

這對我來說非常重要,因爲在我的網站中,我在用戶進行身份驗證時也會這樣做。並且在瀏覽器重新打開後,用戶被註銷。

回答

0

當瀏覽器頁面重新加載時,它也會重新提交$_POST,$_REQUEST$_GET陣列中的數據。 Firefox可能會重複這一過程,而Chrome可能會注意到該過程發生過一次,而不是重新提交數據。

當你刷新一個表單填充頁面時,Firefox會經常想出一個「你確定要重新提交這個數據」顯示,它只是不同的瀏覽器不同的數據。要確保表單提交只發生一次有兩條路線(可能更多):

1)表單和會話工作發生在一個服務器頁面,它不會輸出到瀏覽器,而是轉發到「完成」瀏覽器頁面。然後刷新只需重新加載完成的頁面

2)添加某種形式的標誌,數據庫或(其他)cookie控制,檢查是否已使用cookie中的標誌系統提交$_POST數據。

相關問題