我有一个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。
答案 0 :(得分:1)
如果数据库遭到破坏,并且您始终在用户的会话ID值之前对其进行哈希处理,那么肯定这会使其更安全。这假定数据库泄漏的范围仅是对会话表的视图访问。如果他们具有写访问权限或访问操作PHP源代码,则所有投注均已关闭。
更重要的是要确保会话ID是随机生成的,这样他们就不能蛮力或猜测有效会话ID是什么。因此,没有顺序会话ID,也没有从弱PRNG(早期版本的PHP受此影响)或其他容易确定的值(如时间)生成的ID。
根据您的设置,您可能希望在会话开始时将会话ID限制为用户的IP地址。这有助于防止用户泄露会话ID,无意中通过较差的会话处理(例如,某些服务器重写URL以包括会话ID,然后可以在http referrer标头中泄露)或用户设备上的恶意软件。这有利有弊;攻击者无法利用他们找到的任何会话ID而无需来自同一IP。但是,如果您的用户支持一些有趣的负载平衡设置,那么他们的会话可以合法地来自几个不同的IP,并且在这种情况下放置IP限制将拒绝他们的服务。
OWASP提供了更多会话做和不做的深入总结:https://www.owasp.org/index.php/Session_Management_Cheat_Sheet
答案 1 :(得分:0)
我想知道在评估之前是否散列会话ID会增加安全性吗?
是的,确实如此。但只有在这种情况下,攻击者才能从数据库中读取任意数据,例如:例如,通过SQL注入,并希望劫持活动会话。在这种情况下,找到散列函数的输出值(即,存储的会话ID)的输入值(即,发送的会话ID)将构成pre-image attack。还有一个major goal of cryptographic hash functions is pre-image resistance。