簡體   English   中英

如何在PHP中重新初始化會話?

[英]How to re-initialize a session in PHP?

我正在嘗試將現有的支付平台集成到我的網上商店。 在成功完成交易后,支付平台向我的應用程序中的URL發送請求,其中包含查詢參數中包含的事務ID。

但是,我需要進行一些后處理,如發送訂單確認等。為了做到這一點,我需要訪問用戶的會話,因為那里存儲了很多與訂單相關的信息。 為此,我將session_id包含在初始請求XML中,並在事務完成后執行以下操作:

$sessionId = 'foo'; // the sessionId is succesfully retrieved from the XML response
session_id($sessionId);
session_start();

上面的代碼工作正常,但$_SESSION仍然是空的。 我忽視了什么或者這根本不可能嗎?

編輯:

感謝所有的答案。 問題尚未解決。 如上所述,奇怪的是我可以使用屬於下訂單的用戶的session_id成功啟動新會話。 還有其他想法嗎?

不是您要求的,但是在將客戶發送到付款服務之前,您是否需要將訂單保留在數據庫中? 當您收到付款確認后,最好在訂單后處理時依賴持久數據。

依靠會話是不可靠的,因為你不知道這個確認需要多長時間(通常它是即時的,但在極少數情況下會有延遲)。

此外,如果您的網絡服務器在此時間段內重新啟動,將使您丟失相關數據。

第三個問題是,如果你有一個負載平衡解決方案,具有單獨的會話管理(非常常見),那么你將無法保證支付服務器和你的客戶端將到達同一個網絡服務器(因為粘性通常是基於源IP的)。

我會冒昧地猜測,因為域名與會話設置到您嘗試讀取的位置不同,php正在安全地播放,而不是檢索由不同域設置的會話數據。 它是為了保護安全性,以防有人猜測會話ID並劫持數據。

為此,假設交換發生在同一物理磁盤上的解決方法是臨時將訂單數據寫入序列化(並且可能加密,具體取決於是否正在跟蹤完整的信用卡號,這是一個完整的另一個故事)文件一次接收端讀取的內容會立即刪除。

實質上,所有這一切都重復了您試圖擺脫會話的功能而沒有煩人的安全副作用。

非常感謝所有回復。

Smazurov的回答讓我思考並讓我再次忽略了我的PHP配置。

PHP的默認行為是不加密的會話相關的數據, 將使我們可以從另一個客戶端重新啟動舊的會話后,讀出的會話數據。 但是,我使用Suhosin進行修補並防止出現一些安全問題。 Suhosin的默認行為是基於用戶代理加密會話數據 ,使得讀取其他人的會話變得更加困難。

這也是我的問題的原因; 禁用此行為已解決此問題。

在嘗試啟動新會話之前,請確保關閉當前會話。 所以你應該這樣做:

$id = 'abc123';
session_write_close();
session_id($id);
session_start();

很臟,但對我有用:

告訴支付網關使用

http://yourdomain.com/callbackurl.php?PHPSESSID=SESSIONIDHERE

如果您設置某些配置變量(session.use_trans_sid),PHP會使用這種方法來傳遞會話,即使已經告知PHP不這樣做,它似乎也能正常工作。 它當然總是對我有用。

編輯:

您的問題可能是您將session.auto_start設置為true - 因此會話在代碼運行之前使用它生成的任何ID自動啟動。

如何在另一個PHP頁面中執行此操作,並在iframe中包含/重定向用戶到第二頁?

我不確定您的交易和支票之間的確切時間長短; 但是你的會話cookie肯定已經過期了。 默認情況下,會話通常在45分鍾左右到期。 這是為了釋放更多用於php的uniqid,並防止潛在的會話劫持。

我不確定你是否有一個自定義會話處理程序,它是否存儲在數據庫中,但是從你在這個頁面上的帖子和評論中猜測我會假設它存儲在服務器端cookie中。

現在解決您的問題的方法是咬住子彈並將必要的數據存儲在數據庫中並通過會話ID訪問它,即使這意味着創建另一個表位於訂單表旁邊。

但是,如果您正在立即執行操作,則另一種解釋是用戶注銷或提交了破壞其會話的操作(刪除服務器端cookie)。

您將在servers / tmp文件夾中看到這些cookie,嘗試查看您的cookie,它應該命名為'sess'+ $ session_id。

暫無
暫無

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

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