2011-06-29 84 views
5

當用戶登錄網站時,我只在SESSION中保存user_id,以便以後用戶是否登錄進行檢查。

if(!empty($_SESSION['user_id'])){ 
    .... 

這是否足夠安全?

+3

小心:可能有用戶'ID == 0'。 – Jon

+1

是的,所以使用isset()! 另請參閱我的答案。 – ComFreek

+0

從技術上講,只考慮基本情況,*是*。除此之外,您應該儘可能重新使用現有的身份驗證框架,因爲它確實很複雜。例如,看一下https://github.com/delight-im/PHP-Auth,它既是框架不可知的,也是與數據庫無關的。 – caw

回答

12

這完全取決於該變量如何使其進入會話以及您如何管理會話。

處理網站安全和用戶憑證時總是要考慮的一種情況是,用戶可能會在公共環境中登錄到您的網站,然後走開。他會保持登錄多久?在已經登錄的情況下,敏感信息的可訪問性如何?

如果你有一個相對較短的會話超時,並確保你正在管理什麼使它成爲$ _SESSION ['user_id'],那麼這是一個合理的方法。實際檢查$ _SESSION ['user_id']中的值可能會更好,但這不會比你目前擁有的大大改進。

我建議考慮的主要事情是如果用戶想要更改帳戶的詳細信息/訪問過度敏感的數據,則需要再次登錄憑據(您不希望陌生人更改用戶的登錄信息名字你會嗎?)。雖然這對常規用戶來說可能有點麻煩,但它肯定會爲您的應用程序增加一個很好的安全措施。

+3

+1,用於在帳戶明細更新中要求登錄憑據。 –

7

只有當某人有權訪問會話文件時才能更改該值。因此通常

但我寧願使用isset()

​​

因爲如果用戶ID爲0,empty()也將返回true!

0

這取決於...

,如果你從來沒有這樣做$ _SESSION [ 'USER_ID'] = $ _GET [ 'user_ID的']你通常可以說:它是保存。

但有些事情像會話劫持,跨站點腳本,跨站請求僞造等等。

-1

不是真的,除了上面的註釋之外,您還應該檢查IP地址或USER_AGENT等屬性以避免會話劫持。

+1

基於固定IP的會話是一件壞事。 IP之間並不總是靜態的請求.. –

+0

這些都是兩個例子,可能有其他方式來重新檢查一個有效的會話。但是,基於IP的會話可能不太好,但僅依靠會話ID –

1

如果您處於共享主機環境中,同一服務器上的其他人可能會創建有效會話並獲得訪問權限。

或者,有人可能會嗅探網絡流量,因爲您的一位用戶訪問該網站,並且可能會捕獲Cookie並獲得對其帳戶的訪問權限,因爲您僅使用基於簡單會話的身份驗證。

解決此問題的常用方法是創建一個數據庫表(可能稱爲「會話」),並記錄用戶首次登錄時要收集的會話ID,IP地址以及任何其他用戶特定的數據。然後您可以重複檢查這個會話表,以確保它確實是原始用戶登錄而不是其他人。

+0

是非常糟糕的是,您是對的。我已經在DB中創建了一個會話表。它更安全。非常感謝 – dino

+1

@dino - 太好了,你已經領先於遊戲了。只要確保像其他人提到的那樣使用isset(),並根據會話表檢查已登錄的用戶,則對於用戶會話應該是安全的明智之舉。還有其他一些策略可以用來增加安全性,甚至可以像加密協議一樣儘可能地保護傳輸的實際數據,但對於大多數通用網站,您應該完全正確地使用它們。祝你好運! – Nick

0

使用

if(!isset($_SESSION($user_id){ 

因爲如果$ USER_ID == 0那麼的isEmpty()將無法正常工作,並確保不要求另一頁上的會議必須在頁面結​​束好轉後給予取消安全。解除特定會話變量的方法是

unset($_session_variable_name); 

並且會話應該在需要時銷燬,即當用戶註銷時。

謝謝