2010-05-26 40 views
1

我們正在使用PHP開發支付網關係統。我們使用會話來存儲購物車數據。系統會將您帶到付款處理器的網站,然後返回您的網站。在大多數主機上,當我們回到我們的網站並且會話數據仍在那裏時,我們沒有任何問題。對於那些有問題的人,關閉PHP會話referer_check過去一直有效。我們並不想將PHPSESSID作爲GET變量,希望避免這種情況。我正在尋找的是其他服務器配置會導致會話被終止的情況,以及可能存在的其他任何解決方法。幫助PHP會話在離開現場後繼續存在

感謝您的幫助。

回答

0

我有同樣的問題,它主要與cookie的生命週期和cookie域有關,例如www.example.org與example.org不同。

+0

從http://php.net/manual/en/function.session-set-cookie-params.php「做餅乾上的所有子域,則域必須與像」點前綴可見。 php.net'。「...有幫助嗎? – 2010-05-26 20:55:13

+0

這顯然應該有所幫助,.example.org進入cookiedomain – Andy 2010-05-26 22:00:56

1

使用基於cookie的會話有幾種可能性:

  • 什麼域名Cookie集? mysite.com和secure.mysite.com並不相同。
  • 問題是否出現在給定Web主機的所有Web瀏覽器上?
  • 您是否在任何時候致電session_regenerate_id
  • 您是否正在編寫會話cookie並從相​​同的PHP頁面重定向到付款處理器?也許網絡主機沒有發送正確的標題。我建議加載Firebug並檢查瀏覽器中的會話cookie是否與服務器上的當前會話ID匹配。
  • 當你運行phpinfo()的問題,web主機確實session.refer_check實際上有所需的值?

有很多可能性。這裏是所有其中許多與對話相關的PHP運行時設置可能會導致一個問題:PHP安全的

http://www.php.net/manual/en/session.configuration.php

0

這AA非常陰暗的區域 - 如何堅持對話,而不在暴露cookie或會話ID網址是什麼?不幸的是,唯一有點安全的解決方案恰好與cookie相關,但我會盡量解釋一種儘可能安全的方法。

在用戶離開現場之前,您需要準備數據庫以接受它們,而無需再次提供登錄詳細信息 - 在用戶表中創建兩列 - 「鍵」和「超時」。

現在,當用戶準備通過支付網關離開網站時,您需要更新其在數據庫中的記錄 - 生成一個唯一的密鑰來存儲。

$key = md5(uniqid(rand(), true)); 

其存儲在DATEBASE與超時一起(比方說,一兩個小時,甚至一整天 - 無論你需要)。只要它們在規定的時間內返回並能產生正確的密鑰,系統就會繼續識別用戶,而不必擔心再次登錄。

現在我們需要設置一個cookie,使用相同的密鑰,例如,他們的用戶名的鹽醃md5散列(以防萬一)。一定要給它與你在數據庫中記錄他們的記錄相同的超時時間(你不想讓敏感信息的老餅乾永遠躺在那裏)。

一旦他們返回到網站抓取具有唯一ID和他們哈希用戶名的cookie,並將其與數據庫中的鍵/超時組合進行比較。如果他們匹配,一切都很好。然後刪除該cookie。

0

沒有餅乾沒有會話,只需要使用發送作爲附加參數的uniq的ID或屬性的支付系統(通常TX ID也可以做),在返回頁面URL寫一個函數來標識ID收到uniq的和比較,如果爲true,則爲用戶創建一個新會話。

+0

沒有cookie沒有會話絕對是真的(假設這是配置的機制),但瀏覽器應該發送cookie時,它被重定向到OP的網站。 – grossvogel 2010-06-28 22:48:47

0

至於會話超時問題,它必須是服務器中配置的時間長度。您可能需要查看服務器的php.ini文件。

我得知道,下面就可以改變這個時間:

php_value session.gc_maxlifetime 72000 /* I have not tested this */ 

我想你可以使用我的方法在頁面上使用下面的腳本來創建用戶會話的指紋ID離開之前該網站和返回頁面上。

$string = $_SERVER['HTTP_USER_AGENT']; 
$string .= 'GHYU&*%HHD#JSFHJJFD(*JFJ'; // any long value 
     /* Add any other data that is consistent */ 
$fingerprint = md5($string); 



if (isset($_SESSION['HTTP_USER_AGENT'])) 
    { 
     if ($_SESSION['HTTP_USER_AGENT'] !== $fingerprint) 
     { 
      /* Prompt for password */ 
      session_destroy(); 
      header("Location:"."URL/PATH/TO/LOGIN"); 
     } 
    } 
else 
    { 
     $_SESSION['HTTP_USER_AGENT'] = $fingerprint; 
}