簡體   English   中英

ZF2:如何實現會話超時和會話固定修復

[英]ZF2: How to implement session timeout and a session fixation fix

我希望會話在閑置30分鍾后過期,但是當我進行設置時,即使他們可能只有幾秒鍾的閑置時間,我的用戶也會隨機注銷。 我認為問題在於重新生成會話ID。

我的理解是,要獲得理想的效果,我需要在會話$sessionMgr->start()配置為1800。然后在我的引導程序中,調用$sessionMgr->start() ,需要調用$sessionMgr->rememberMe()

rememberMe()調用regenerateId() ,我認為這就是問題所在。 我認為,如果瀏覽器快速連續觸發兩個請求,則將處理第一個請求,並在服務器上更新會話ID。 當服務器收到第二個請求時,它仍然帶有舊的會話ID,該ID不再被識別,因此服務器將您視為已注銷。 這聽起來可能嗎? 我認為一定是這樣,因為我可以通過直接調用regenerateId() (而不是調用rememberMe() )來模擬問題。

那么,問題是我應該如何實現所需的解決方案? 就會話超時而言,我可以在會話中存儲“上次訪問”時間,並在收到請求時將其與當前時間進行比較。 但這將使rememberMe()功能變得多余。 至於重新生成ID以避免會話固定,我看不到如何有效地做到這一點。 在某些情況下,總是快速連續有多個瀏覽器請求,因此服務器可能不同步...

對於會話超時,您可以執行以下操作。 我在每個控制器擴展的類中具有此功能,並且此超時方法在每個請求上運行。 另外,超時值最初是在登錄時設置的。

/**
 * If user is inactive for 5 minutes, log them out.
 * 
 * @return void | Zend\Mvc\Controller\Plugin\Redirect
 */
protected function timeout()
{
    // User Active so reset time session. (5minutes)
    // Note: (I'm using $this->identity which is basically an Auth object)
    // but would work the same way as $_SESSION['timeout']
    if ($this->identity->timeout + 300 > time()) 
    {
        $this->identity->timeout = time();
    } 

    // session timed out, logout user
    // this routes to the location of destroying the session, etc.
    else 
    {   
        return $this->redirect()->toRoute('logout', array());
    }       
} 

另外,如果您要自動注銷用戶而不必刷新頁面,則可能要使用AJAX在要重置的(n)秒后檢查超時值。

防止會話固定:我尚未在ZF2中實現它。 但是我在ZF1中所做的,並且工作正常,沒有任何問題。 我知道這確實無法給您答案,但是我認為在ZF2中也可以使用相同的方法。

隨機注銷:在某些應用程序中,通過更改php.ini文件中的某些會話屬性可以解決此問題。 在另一個應用程序中,我目前正在使用ZF2的RememberMe rememberMe($time) ,沒有任何問題。

查看如何設置會話存儲選項並初始化會話名稱空間對象也可能會有所幫助。 Zend\\Session\\Container注意以下文檔塊:

/**
 * Session storage container
 *
 * Allows for interacting with session storage in isolated containers, which
 * may have their own expiries, or even expiries per key in the container.
 * Additionally, expiries may be absolute TTLs or measured in "hops", which
 * are based on how many times the key or container were accessed.
 */

所以像這樣:

$this->session = new SessionContainer($this->namespace, $manager);

並設置記住我:

$this->session->getManager()->rememberMe($time);

希望這能為您指明正確的方向。

好的,所以我從錯誤的角度出發。 我以為“記住我”和“ cookie生存期”旨在幫助會話超時。 正如這個問題所明確指出的, 如何在30分鍾后使PHP會話到期? ,我應該實施自己的解決方案。

此外,在閱讀了http://phpsec.org/projects/guide/4.html這篇文章之后,我可以看到我真的只需要在用戶登錄或注銷時重新生成會話ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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