2008-09-26 57 views
86

PHP會話ID有多獨特?我從我讀過的各種東西中得到了印象,我不應該依賴兩個用戶永遠不會獲得相同的sessionid。它不是一個GUID?php會話ID有多獨特

回答

32

Session_id確實可以重複,但概率非常低。如果您擁有一個流量相當的網站,它可能會在您的網站生活中發生一次,並且只會讓一個用戶煩擾一次。

這是不值得關心,除非你希望建立一個非常高流量的網站,或爲銀行業界的服務。

2

沒有,會話ID是不是一個GUID,但兩個用戶不應該得到相同的會話ID,因爲他們都存儲在服務器端。

+0

請問爲什麼我要投票呢? – gizmo 2008-09-26 11:08:01

+2

可能是因爲服務器端存儲不能以任何方式保證唯一性。 唯一性是一回事 - 如果發生碰撞,無論會話存儲在何處,它都會發生碰撞。 – 2008-09-26 11:29:50

+0

不是由我,我感謝您的迴應(以及其他人)。 - Jalov – Jalov 2008-09-26 11:32:45

3

我還沒有找到這樣的確認,但我相信PHP檢查是否會話ID創建一個與之前的ID已經存在。

會話劫持問題的人擔心的是,當有人發現了一個活躍用戶的會話ID。這可以通過很多方式來預防,更多關於你可以在php.net上看到this page的信息和this paper on session fixation

+2

...但是如果你只是一個數個銀行中的一個php服務器,則不能保證服務器有足夠的知識來知道sesssionID是否已被使用。 – djsadinoff 2008-09-26 11:03:26

+0

是的,這是一個很好的觀點。 – 2008-09-26 11:06:02

59

這不是很獨特的發貨。在默認配置中,它是包含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

5

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的概率很大。

10

如果您想了解PHP默認生成會話ID的方式,請查看Github上的源代碼。這當然不是隨機的,是基於散列(默認:MD5),這些成分的(見代碼片段的行310):

  1. 客戶端的IP地址
  2. 當前時間
  3. PHP線性同餘發生器 - 僞隨機數發生器(PRNG)
  4. OS專用隨機源 - 如果OS具有可用的隨機源(例如/ dev/urandom的)

如果OS具有可用的隨機源然後爲作爲一個會話ID的目的所產生的ID的強度高(的/ dev/urandom的和其他OS隨機源(通常)加密的安全的PRNG) 。但如果不是,那麼它是令人滿意的。

與會話身份生成的目標是:

  1. 減少生成兩個會話ID具有相同值的概率
  2. 使得它非常具有挑戰性的計算,生成隨機密鑰,並創下了在使用一個

這是通過PHP的會話生成方法實現的。

你不能絕對保證唯一性,但是兩次碰到相同散列的概率非常低,一般來說不值得擔心。