2016-04-01 34 views
-1

我對安全有很大的關注,我試圖確保我的$ _SESSION。我希望你的建議。是我保證會話安全的方式嗎?

  1. 當用戶創建帳戶時,我在他們的數據庫配置文件中生成一個隨機值11111 - 99999。

  2. 當用戶登錄時,我創建了一個包含大部分用戶數據(無密碼或任何關鍵信息)的會話。在$ _SESSION中,我還添加了在步驟1中創建的隨機數的加密版本,並且還創建了具有相同加密數字的$ _COOKIE,以用於檢查會話是否有效。

  3. 在我的應用程序上,當我收到一個請求時,我檢查$ _SESSION是否存在,實際上它應該存在,但爲了防止黑客(猜測或破解)其他人的會話ID,我將密鑰的加密值$ _COOKIE和$ _SESSION中的一個。

主要任務是,這種方法有多安全?我看不出任何黑客可以竊取$ _SESSION ID並同時加密密鑰。

密鑰的加密是由位於服務器上的加密值生成的,而不是以簡單的md5生成的,這在我看來很容易重現。因爲黑客無法知道我用於加密該密鑰的加密值。

然後在用戶在服務器上發送請求的最終時,它看起來像這樣(我簡化了代碼)。

if(isset($_SESSION['key'])){ 
    if($_SESSION['key'] == $_COOKIE['key']){ 
     // do stuff here 
    } 
    else { 
    die(); 
    } 
} 
else { 
    die(); 
} 
+2

_「我看不出任何方式如何黑客既可以竊取某人的$ _ SESSION ID,並在同一時間知道加密密鑰「_ - 爲什麼不?您正在將會話ID和隨機值存儲在cookie中 - 因此,如果攻擊者能夠訪問一個,爲什麼他們不能同時訪問另一個? //你的問題讀起來像你可能是這方面的新手 - 在這種情況下,我認爲如果你像使用PHP會話機制那樣,最好不要自己添加任何東西。 – CBroe

+0

當然,我的目標是保護我的應用程序,不幸的是我知道我無法保護用戶計算機免遭黑客入侵,但是我主要想防止的是(會話ID猜測),那麼即使我認爲如果您在瀏覽器中訪問了會話ID您還需要訪問與該用戶對應的加密密鑰。 – Mireille28

+0

因此,攻擊者現在不需要猜測一個值,而需要猜測兩個值。基本上,你剛剛添加了*更多的熵*,這意味着攻擊者將不得不猜測*更長的值*。您可以簡單地通過生成更長的會話ID來實現這一點,它具有相同的效果。 – deceze

回答

0

有沒有必要這樣做。會話驗證已由PHP爲您處理。當你開始一個會話時,一個cookie將在客戶端創建,並在服務器端創建一個文件。 Cookie包含服務器端的文件名。只要Cookie存在於瀏覽器或會話被破壞,會話就會持續。

另見:How do PHP sessions work?

在我的應用程序

然後當我收到一個請求我檢查 $ _SESSION事實上是存在的,應該存在,但是以防止黑客( 猜測或破解)其他人會議ID我比較從$ _COOKIE的關鍵encryped值 與$ _SESSION

至於一開始你可能session_regenerate_id(true);使更難攻擊者劫持會話ID裏面的一個。

有關會話安全一些讀數:

questions/12233406 questions/5081025

+0

謝謝我已經閱讀過,但是我想阻止100%會話ID猜測的可能性 – Mireille28

1

請確保您有關於Cookie的過期並刪除註銷該cookie。

最重要的是,確保會話過期。 否則有人可以竊取cookie並在稍後從另一臺計算機繼續(仍然有效)會話。

我還會在加密中包含用戶IP以及使會話唯一的任何其他數據。

-1

一般的想法對我來說很不錯(我不是專家)。

需考慮的事項: 當cookie不存在時會發生什麼?

另一種方法來生成稍後「散列」的基值,最推薦的方法可能是mcrypt_create_iv()。 您提到的間隔(11111 - 99999)太窄(在計算時間內);如果你想獲得幻想random.org有很好的API隨機數(不只是僞隨機)

+0

如果cookie不存在,我的系統不會讓用戶進入 – Mireille28