2011-09-01 43 views
1

我正在嘗試使登錄系統。 我在做什麼,當用戶登錄時,我正在進行會話['id']並且在那裏放入用戶id。 此外,我正在做所謂的鹽安全事情,這是好的。關於Sessions的另一個安全問題

現在稍後在網站的某些部分我檢查會話['id']去數據庫檢查這樣的id是否具有較高的權限級別並授予該用戶某些功能。此外,我可以檢查鹽,如果用戶是一樣的誰登錄,避免黑客等等等...

我的問題是以下。如果用戶創建新帳戶。並且使用他的帳戶登錄鹽系統對他來說可以,所以他會通過網站旅行,但他的ID會有點低,所以他不會得到所有的功能。但!如果用戶明白我正在查看他的ID以瞭解他是誰,登錄後可以以不同方式給服務器不同的會話['ID']?例如等級高的用戶,並獲得所有獎金? 。因爲我做了會議

ini_set('session.use_only_cookies', true); 
session_start(); 

所以會話數據可能會在他的計算機上嗎? 那可能嗎?

解決

回答

2

會話ID應該是一個完全隨機數。

因此,即使用戶將其會話ID更改爲另一個會話ID,他也不可能以這種方式進入另一個有效會話。它幾乎總是將他註銷。

會話背後的數據只存儲在您的服務器上。

只有會話ID本身被提供給網絡瀏覽器。

ini_set('session.use_only_cookies',true);

您提到的設置只是確保會話ID僅通過cookie傳遞,而不是HTML或URL的一部分。

+0

非常感謝:) – David

+0

現在,接下來您要查看的內容是跨站點請求--Forgery,這是餅乾的缺點。如果請求導致代表用戶執行操作(而不僅僅是隻讀訪問),則不應單獨依賴Cookie。 – Thilo

+0

@Thilo:爲什麼你認爲CSRF與cookies有什麼關係(除了會話作爲防止* CSRF的工具)?OTOH在cookies和會話周圍存在一系列安全問題(例如劫持,固定) – symcbean

0

只有會話ID(通常PHPSESSID)的cookie駐留在用戶機器上,並負責告知正在使用的會話實例的服務器。存儲在$ _SESSION中的數據在服務器內部是安全的,除非您手動將它們發送給客戶端,否則服務器外部沒有人可以看到它們。

1

$ _SESSION的使用很好,因爲其中包含實際數據的文件駐留在服務器上,而不是客戶端的機器上。客戶端只保留一個引用,以便PHP知道在服務器上的會話cookie中查找客戶端會話數據的位置。

+0

ini_set('session.use_only_cookies',true);這件事不會發送會話數據給用戶? – David

+0

不,它只是說會話ID應該存儲在一個cookie中(而不是作爲HTML或URL的一部分) – Thilo