簡體   English   中英

會話ID哈希比普通存儲更安全嗎?

[英]Is session ID hashing more secure than plain storage?

我有一個PHP / MySQL應用程序,用於將會話數據存儲在數據庫中。 以下是有關處理程序的一些偽代碼:

function session_read($sessionId) {
    $result = query('select session_data from sessions where id = ?', $sessionId);
    if(!$result) $result = array('session_data' => '');
    return $result['session_data'];
}

function session_write($sessionId, $data) {
    query('replace into session_data set data = ? where id = ?', $data, $sessionId);
    return true;
}

在我看來,在會話期間,會話ID可以像用戶密碼一樣敏感。 我想知道在評估會話ID之前對會話ID進行哈希處理是否會提供額外的安全性?

function session_read($sessionId) {
    $sessionId = hash('sha512', $sessionId);
    $result = query('select session_data from sessions where id = ?', $sessionId);
    if(!$result) $result = array('session_data' => '');
    return $result['session_data'];
}

function session_write($sessionId, $data) {
    $sessionId = hash('sha512', $sessionId);
    query('replace into session_data set data = ? where id = ?', $data, $sessionId);
    return true;
}

這樣,即使攻擊者設法檢索到會話表的轉儲,他們也將不容易制作出cookie來劫持任何用戶會話。

這是有用的做法嗎?

編輯:該站點通過HTTPS服務,並且cookie是HTTPONLY。

如果數據庫遭到破壞,並且您始終在數據庫中使用該用戶的會話ID值之前對其進行哈希處理,那么可以,這確實使其更加安全。 假設數據庫泄漏的程度只是視圖對會話表的訪問。 如果他們具有寫訪問權或可操縱PHP源代碼的權限,則所有選擇均無效。

需要擔心的更重要的事情是確保會話ID是隨機生成的,因此它們不能只是蠻力或以其他方式猜測有效的會話ID是什么。 因此,沒有順序的會話ID,也沒有從弱PRNG(PHP的較早版本受此影響)生成的ID,也沒有其他易於確定的值(例如時間)。

根據您的設置,您可能希望在會話開始時將會話ID限制為用戶的IP地址。 這有助於防止會話ID被用戶泄漏,這可能是由於會話處理不當(例如某些服務器重寫URL以包括會話ID,然后可能在http引薦來源標頭中泄漏)而無意中泄露的,也可能是用戶設備上的惡意軟件。 這有其自身的優缺點; 攻擊者如果沒有來自同一IP,就無法利用他們找到的任何會話ID。 但是,如果您的用戶使用了一些有趣的負載平衡設置,那么他們的會話可以合法地來自幾個不同的IP,在這種情況下設置IP限制將拒絕他們的服務。

OWASP提供了關於更多會話要做和不要做的深入摘要: https : //www.owasp.org/index.php/Session_Management_Cheat_Sheet

我想知道在評估會話ID之前對會話ID進行哈希處理是否會提供額外的安全性?

是的,它確實。 但僅在這種情況下,攻擊者只能(例如,通過SQL注入)從數據庫中讀取任意數據,並希望劫持活動會話。 在那種情況下,找到哈希函數的輸出值的輸入值(即,發送的會話ID)(即,存儲的會話ID)將構成映像前攻擊 密碼散列函數的一個主要目標是圖像前電阻

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM