2012-09-03 31 views

回答

30

取決於session.hash_functionsession.hash_bits_per_character

查看session_id頁面瞭解更多信息。

越高你session.hash_bits_per_character越短你的 SESSION_ID設置將成爲每個字符使用更多的比特。可能的 值是4,5,或6。

當使用SHA-1散列用於(通過設置 的ini_set(「session.hash_function」,1)下面的會話串 長度由三個會話產生的。 hash_bits_per_character 設置:

4 - 40字符串

5 - 32字符串

6 - 27字符串

+0

所以40個字符是一個安全的設置,如果我想保存一些字節,我必須檢查php配置,對吧? – Gustavo

+0

檢查php.ini以查看設置是什麼。 40個字符是SHA-1散列函數的結果,每個字符4位。你可以做'echo strlen(session_id());'查看長度並相應地創建你的數據庫字段。 – sachleen

+3

作爲參考,如果您使用MD5散列函數和每個字符4個散列位,則session_id長度也將爲32。這讓我今天把頭髮撕掉了幾個小時。 – sevenseacat

4

這取決於這些配置設置: session.hash_functionsession.hash_bits_per_character

較短的會話ID的長度有碰撞的機率較高,但這也取決於ID生成算法很多。鑑於默認設置,會話ID的長度應該適用於大多數應用程序。對於更高安全性的實現,您可以考慮查看PHP如何生成其會話ID並檢查它是否具有密碼安全性。如果不是,那麼你應該用一個密碼安全的隨機源來推出你自己的算法。

+3

碰撞的機會完全由散列函數,使用熵,和流量的體積來確定。使用更安全的散列函數會產生更大的會話ID字符串,所以如果這就是您認爲較短的會話ID長度具有更高的碰撞可能性,那麼您是正確的,但是通過使用每個字符更高的位深度來縮短該長度將不起作用。 – Jason

+0

長度爲128個字符的會話ID是通用Web應用程序的矯枉過正? – TheFrost

26

@sachleen回答不全。
關於會話ID長度的更詳細的信息被描述爲here

摘要:

128-bit digest (MD5) 
4 bits/char: 32 char SID  
5 bits/char: 26 char SID  
6 bits/char: 22 char SID 

160-bit digest (SHA-1) 
4 bits/char: 40 char SID  
5 bits/char: 32 char SID  
6 bits/char: 27 char SID 

而且樣本正則表達式來檢查會話ID:

preg_match('/^[a-zA-Z0-9,-]{22,40}$/', $sessionId) 
+1

這對我很有幫助! – SirJ

+3

優秀的答案,對我來說缺少一個難題。 –

0

我不知道我的應用程序將用於然後我將它設置爲: VARCHAR( 127) ,希望對未知的MySQL用戶來說它會很好。

+1

如果你知道你的意思是未知的,你可能會考慮將它設置爲TEXT,它會根據需要收縮和擴展,否則你的表中會有很多空的空間,即使如此,它也可能會失敗,長度值爲128 。 – Gustavo

+0

@GustavoPinent VARCHAR比TEXT更快。 –

+0

@TichomirMitkov是的,他將不得不在安全和靈活的TEXT和快速VARCHAR – Gustavo

0

通過常規PHP安裝長度總是26(exmp:psprdaccghmmre1oo2eg0tnpe6)

相關問題