PHP會話ID有多獨特?我從我讀過的各種東西中得到了印象,我不應該依賴兩個用戶永遠不會獲得相同的sessionid。它不是一個GUID?php會話ID有多獨特
回答
Session_id確實可以重複,但概率非常低。如果您擁有一個流量相當的網站,它可能會在您的網站生活中發生一次,並且只會讓一個用戶煩擾一次。
這是不值得關心,除非你希望建立一個非常高流量的網站,或爲銀行業界的服務。
沒有,會話ID是不是一個GUID,但兩個用戶不應該得到相同的會話ID,因爲他們都存儲在服務器端。
我還沒有找到這樣的確認,但我相信PHP檢查是否會話ID創建一個與之前的ID已經存在。
會話劫持問題的人擔心的是,當有人發現了一個活躍用戶的會話ID。這可以通過很多方式來預防,更多關於你可以在php.net上看到this page的信息和this paper on session fixation
...但是如果你只是一個數個銀行中的一個php服務器,則不能保證服務器有足夠的知識來知道sesssionID是否已被使用。 – djsadinoff 2008-09-26 11:03:26
是的,這是一個很好的觀點。 – 2008-09-26 11:06:02
如果你想自定義ID的生成方式,你可以安裝一個替代的哈希生成函數(這是一個128位默認情況下通過MD5生成的數字)。請參閱http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function
有關PHP會話的更多信息,請嘗試這篇出色的文章http://shiflett.org/articles/the-truth-about-sessions,該文章還鏈接到其他關於會話固定和劫持的文章。
這不是很獨特的發貨。在默認配置中,它是包含gettimeofday(這不是非常獨特)結果的散列結果,但如果您擔心,應該將其配置爲從/ dev/urandom中繪製一些熵,如下所示
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
搜索在the code「php_session_create_id」他們正在使用的實際算法。
編輯爲: 有一個由pid播種的DFA隨機數生成器,與usecs中的時間混合在一起。這不是一個堅定的唯一性條件especially from a security perspective。使用上面的熵配置。
更新:
由於PHP 5.4.0 session.entropy_file默認的爲/ dev/urandom的或 的/ dev/ARANDOM(如果可用)。在PHP 5.3.0中,該指令默認爲空,爲 。 PHP Manual
session_id的大小
假設seesion_id是均勻分佈的,並且大小= 128位。假設地球上的每個人每天登錄一次,持續1000年的新會話。
num_sesion_ids = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36) ≈ 1 - e**-(1/2**46)
≈ 1/2**46
所以一次或多次碰撞的概率小於7萬億分之一。因此,session_id的128位大小應該足夠大。正如其他評論中提到的那樣,session_manager可能還會檢查新的session_id是否已經存在。
隨機性
因此最大的問題,我認爲是SESSION_ID是否:■與良好的僞隨機生成的。在這一點上你永遠無法確定,但我會建議使用一個衆所周知的,經常使用的標準解決方案來實現這個目的(你可能已經這麼做了)。
即使由於檢查而避免了衝突,session_id的隨機性和大小也很重要,因此黑客無法以某種方式進行合格的猜測並發現活動session_id:s的概率很大。
如果您想了解PHP默認生成會話ID的方式,請查看Github上的源代碼。這當然不是隨機的,是基於散列(默認:MD5),這些成分的(見代碼片段的行310):
- 客戶端的IP地址
- 當前時間
- PHP線性同餘發生器 - 僞隨機數發生器(PRNG)
- OS專用隨機源 - 如果OS具有可用的隨機源(例如/ dev/urandom的)
如果OS具有可用的隨機源然後爲作爲一個會話ID的目的所產生的ID的強度高(的/ dev/urandom的和其他OS隨機源(通常)加密的安全的PRNG) 。但如果不是,那麼它是令人滿意的。
與會話身份生成的目標是:
- 減少生成兩個會話ID具有相同值的概率
- 使得它非常具有挑戰性的計算,生成隨機密鑰,並創下了在使用一個。
這是通過PHP的會話生成方法實現的。
你不能絕對保證唯一性,但是兩次碰到相同散列的概率非常低,一般來說不值得擔心。
- 1. PHP獨特會話
- 2. NSURLConnection返回多個php會話ID
- 3. PHP會話ID值到多個頁面
- 4. 註銷特定會話ID
- 5. Laravel會話問題:多個會話ID
- 6. PHP session_id()不接受現有會話ID
- 7. PHP會話ID似乎沒有刷新
- 8. PHP - 結束會話ID
- 9. PHP:非法會話ID
- 10. PHP重命名會話ID
- 11. PHP會話ID重定向
- 12. PHP會話ID重複?
- 13. php cURL無效會話ID
- 14. PHP會話創建者ID
- 15. cakePHP「會話」沒有返回會話ID
- 16. 獨特INT ID
- 17. Android獨特ID
- 18. ManagedThreadID有多獨特?
- 19. HttpSession.getId()有多獨特?
- 20. uniqid有多獨特?
- 21. 會話薩特斯沒有在PHP
- 22. PHP多個會話
- 23. PHP session_start cookie不會保存會話ID
- 24. 每次會話Google Analytics事件獨特
- 25. PHP mysql獨特,只加載1組ID
- 26. PHP獨特的計算機ID
- 27. PHP會話和獨特的用戶令牌
- 28. 單獨會話
- 29. 多對一許多獨特協會
- 30. 使用特定的會話ID創建會話
請問爲什麼我要投票呢? – gizmo 2008-09-26 11:08:01
可能是因爲服務器端存儲不能以任何方式保證唯一性。 唯一性是一回事 - 如果發生碰撞,無論會話存儲在何處,它都會發生碰撞。 – 2008-09-26 11:29:50
不是由我,我感謝您的迴應(以及其他人)。 - Jalov – Jalov 2008-09-26 11:32:45