簡體   English   中英

PHP SESSION處理-無效值

[英]PHP SESSION handling - invalid values

我們需要在許多現有代碼中使用session_write_close()。 但這對我們來說似乎很危險,因為PHP會執行以下操作-而不給出任何警告或錯誤:

session_name('goodoldasdf');
session_start();

if (!empty($_SESSION['var'])) {
print ' Session-Data: '. $_SESSION['var'];
}

$_SESSION['var'] = "before";

session_write_close();

$_SESSION['var'] = "after"; // notice: definition after write close!

print ' B: '. $_SESSION['var'];

當我們在session_write_close之后定義SESSION-var時,PHP不會將SESSION寫入MemcacheD會話處理程序(如預期的那樣)-但它仍在同一腳本運行時內部使用覆蓋。

輸出:“偽會話數據: 之后 ”。

第二輪:

輸出:“會話數據: 偽會話數據之前:” 之后

問題是: 如何確保PHP沒有使用未實際寫入會話的 SESSION-vars? 有沒有辦法在這里獲取PHP警告? 或有任何解決此問題的建議?


為什么我們需要到處添加寫關閉:將“ PHP 5.x”更新為“ PHP 7”后,所有操作都變慢了。 尤其是在AJAX請求或同時加載mutli選項卡上。 這是因為PHP 7似乎改變了它的SESSION處理/阻塞。

很好的演示: https : //demo.ma.ttias.be/demo-php-blocking-sessions/

因此,我們需要將session_write_close添加到許多腳本中-避免冒險使用無效的session-values。

您可以查看session_status()的輸出( Docs

switch(session_status()) {
    case PHP_SESSION_DISABLED:
        die('Sessions disabled on this server');
    case PHP_SESSION_NONE:
        die('Session has not been started, or has been closed');
    case PHP_SESSION_ACTIVE:
        die('There is currently an active session');
}

您可以將其與包裝函數一起使用,以獲取/設置會話變量。

代替session_write_close(); 編寫自己的函數並取消設置超全局變量:

function session_stop() {
    session_write_close();
    unset($_SESSION);
}

現在您將獲得:

注意:文件X行Y中的未定義變量:_SESSION

暫無
暫無

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

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