我有一个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之前对其进行哈希处理是否能提供额外的安全性?
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,然后会话ID可能会在http引用头中泄漏),也可能是用户设备上的恶意软件。这有它自己的优点和缺点;攻击者不能利用他们发现的任何会话ID而不来自同一IP。但是,如果您的用户支持一些有趣的负载平衡设置,则他们的会话可以合法地来自多个不同的IP,在这种情况下设置IP限制将拒绝他们的服务。
OWASP提供了更多会话操作和操作的深入摘要:https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

09-04 21:13
查看更多