簡體   English   中英

創建自定義PHP Session處理程序?

[英]Creating custom PHP Session handler?

現在我在使用PHP的本機會話管理或創建我自己的(基於MySQL的)會話系統之間陷入困境,我對這兩者都有一些問題。

  1. 除了會話固定和會話劫持之外,使用PHP的本機會話處理代碼還有什么其他問題? 這兩個都有簡單的修復,但我一直看到人們編寫自己的系統來處理會話,所以我想知道為什么。

  2. 基於MySQL的會話處理程序會比PHP的本機會話更快嗎? 假設一個標准(非'內存')表。

  3. 使用session_set_save_handler有什么重大缺點嗎? 我可以使它在大多數情況下符合我的標准(除了命名)。 另外,我個人喜歡使用$_SESSION['blah'] = 'blah' $session->assign('blah', 'blah')或者某種程度的想法。

  4. 有什么好的PHP會話資源,我應該看一看? 我最后一次與會議合作是在10年前,所以我的知識有點停滯不前。 谷歌和Stackoverflow搜索產生了很多基本的,明顯寫得不好的教程和示例(在cookie中存儲用戶名+ md5(密碼)然后創建一個會話!),所以我希望這里有人有一些合法的,更高級的資源。

  5. 無論我的選擇如何,我都會強制采用純cookie方式。 這有什么不對嗎? 在平均安全環境中,此代碼將支持的站點具有普通用戶。 我記得上次使用會話時這是一個很大的問題,但使用in-url會話的想法讓我非常緊張。

2)的答案是 - id取決於。 讓我解釋一下:為了使會話處理程序正常運行,你真的應該實現某種類型的鎖定和解鎖機制。 MySQL方便地具有鎖定表和unclock表的功能。 如果您沒有在會話處理程序中實現表鎖定,那么您可能會面臨基於ajax的請求中的競爭條件。 相信我,你不要那些。

閱讀這篇解釋自定義會話處理程序中競爭條件的詳細文章:

好吧,如果你像每個會話調用一樣添加LOCK TABLE和UNLOCK TABLE,那么你的自定義會話處理程序會慢一點。

你可以做的一件事就是使用HEAP表來存儲會話。 這意味着數據將僅存儲在RAM中,並且永遠不會寫入磁盤。 這將快速工作,但如果服務器出現故障,所有會話數據都將丟失。

如果你確定在服務器關閉時會話丟失的可能性,那么你應該使用memcache作為會話處理程序。 Memcache已經擁有了使用php會話處理程序所需的所有功能,所有你需要安裝memcache服務器,安裝php的memcache擴展,然后添加這樣的東西給你php.ini

[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files
session.save_handler = memcache
session.save_path="tcp://127.0.0.1:11215?persistent=1"

這將比基於默認文件的會話處理程序快得多

使用MySQL作為會話處理程序的優點是,您可以編寫執行其他操作的自定義類,將數據保存到會話時的額外操作。 例如,假設您將表示USER的對象保存到會話中。 您可以使用自定義會話處理程序從該OBJECT中提取用戶名,用戶ID,頭像並將它們寫入MySQL SESSION表中,並將其寫入自己的專用列,從而可以輕松顯示Who's在線

如果在會話處理程序中不需要額外的方法,則沒有理由使用MySQL來存儲會話數據

PHP應用程序在請求之間丟失會話信息。 由於斯坦福有多個Web服務器,因此可能會將不同的請求定向到不同的服務器,因此會話信息通常會丟失。

斯坦福的Web基礎結構由多個Web服務器組成,這些服務器不會相互共享會話數據。 因此,請求之間的會話可能會丟失。 使用MySQL有效地抵消了這個問題,因為所有會話數據都是從數據庫服務器而不是從Web集群引導的。 在數據庫中存儲會話還具有增加隱私和安全性的效果,因為訪問數據庫需要身份驗證。 我們建議斯坦福大學的所有訪問MySQL的Web開發人員都使用此方法進行會話處理。

參見http://www.stanford.edu/dept/its/communications/webservices/wiki/index.php/How_to_use_MySQL-based_sessions

可能對你有所幫助。

語言標准庫的大多數會話實現僅支持基本鍵值關聯,其中密鑰由客戶端提供(即會話ID),並且值存儲在服務器端(即會話存儲),然后關聯到客戶端請求。

除此之外的任何事情(特別是安全措施)也超出了鍵值關聯的基本會話機制,需要添加。 特別是因為這些安全措施主要伴隨着錯誤:如何確定某個會話請求的真實性? 按IP地址? 通過用戶代理識別? 或兩者? 或者根本沒有會話身份驗證? 這始終是開發人員需要處理的安全性和可用性之間的權衡。

但是,如果我需要實現一個會話處理程序,我不僅會尋找純粹的速度,而是 - 根據要求 - 也是為了可靠性。 Memcache可能很快但如果服務器崩潰,則所有會話數據都會丟失。 與此相反,數據庫更可靠但可能具有與memcache相反的速度下降。 但是在你自己測試和基准測試之前,你不會知道。 您甚至可以使用兩個不同的會話處理程序來處理不同的會話可靠性級別(在memcache中 可靠,在MySQL /文件中可靠 )。

但這一切都取決於您的要求。

它們都是很好的方法,使用MySQL有一些缺點,在某些情況下,流量水平實際上可能會導致服務器崩潰,如果操作不正確或負載太高!

我個人建議,標准會話已經正確處理,只是使用它們並加密你不希望黑客看到的數據。

如果沒有適當的預防措施,使用cookies是不安全的。 除非你需要“記住我”,否則堅持使用會話! :)

編輯

不要使用MD5,它的加密和解密性很差......我建議將數據加鹽並一起加密。

$salt = 'dsasda90742308408324708324832';
$password = sha1(sha1(md5('username').md5($salt));

這種加密不會很快解密,我認為現在不可能。

暫無
暫無

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

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