2013-10-17 42 views
0

所以,我在管理會話時從安全中學到的是,最好的做法是將生成的會話ID保存到客戶端Cookie和其餘數據以保存在服務器上。那麼$ _SESSION究竟發生了什麼?在官方的PHP文檔中,我發現只有很少的描述,沒有說什麼。

我需要在服務器上的數據庫中創建會話表,還是$ _SESSION創建一些臨時表並在那裏保存所有需要的數據?問題是,我需要建立良好和可靠的系統約。 1000個用戶同時登錄到服務器,所以我不知道「讓」$ _SESSION完成所有工作有多好。

$ _SESSION如何生成ID?它是IP和瀏覽器組合的一個ID嗎?我的意思是,它不需要使用cookies的許可,而是它(服務器)爲IP和瀏覽器保存一些ID,這是客戶端沒有任何會話或任何數據。這只是我想如何去的方式,但我不知道該怎麼做,什麼是正確的方式,所以你可以幫我嗎?

+0

試着給這看看它可能會幫助你瞭解一點 http://stackoverflow.com/questions/11155403/how -to-產生-A-獨特-SESS ion-id-in-php –

+0

保存會話數據的默認機制位於服務器的_files_中,其位置由'session.save_path'指定。如果您想使用任何其他存儲方法,則必須自己實現它 - 有關更多詳細信息,請參閱函數「session_set_save_handler」的說明。不,會話ID不是「IP和瀏覽器的組合」,因爲這很容易猜測;它使用系統上可用的隨機數生成器。 – CBroe

回答

1

$_SESSION爲每個會話生成一個隨機ID,該ID不鏈接到IP或其他客戶端信息(如用戶代理)。

  • PHP爲用戶生成一個cookie,它包含會話ID。

  • $_SESSION數組序列化並保存到服務器上的文件中。

  • 當用戶連接一個PHP會話cookie時,會檢查該ID,然後可以從文件中對$ _SESSION數組進行反序列化。

從安全角度來看,需要注意的是PHP不會驗證基於IP或用戶代理用戶,因此用戶可以竊取用戶的另一個cookie和session數據是非常重要的。如果你想要這個功能,那麼你可以輕鬆地實現某些東西,在會話數組中存儲一個散列值,並在會話恢復時檢查它。

也可以編寫自己的會話實現,您只需創建一個具有唯一ID的cookie,然後如您所述 - 將數據存儲在數據庫中。我個人更喜歡創建我自己的UserSession類,它給了我完全的控制權。

0

有關會議的事情是它存儲在其瀏覽器中的客戶端,所以如果你打算讓2網站和分配

$_SESSION['logged']=1;//assign this in website 1 as value if logged 
$_SESSION['logged']=1;//assign this in website 2 as value if logged 

可以在兩個系統中仍然登錄你也知道,你可以使用android應用程序稱爲faceniff會話劫持Facebook帳戶,如果它沒有「https」它就像通過創建相同的會話名稱和值僞裝你是帳戶持有人

我所做的是當用戶登錄我分配一個md5散列作爲會話值並將其插入數據庫中用戶的行,然後檢查數據塊e值爲等於瀏覽器會話 所以數據庫看起來像這樣

id username password   session_code 
1 imbatman superman  12sd5%sda812312y34356 //note this md5 is only an example 
                //but it looks like that but longer i think 

,並在登出我清空數據庫會話並銷燬會話

id username password   session_code 
1 imbatman superman  

但我還在新的PHP和仍然尋找方法來申請更多的安全性在我的網站,但現在這是我在做什麼,以防止滲透