繁体   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