【发布时间】:2014-04-03 18:51:04
【问题描述】:
我有一个 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 在 http 标头中作为 cookie 以明文形式传输。如果你不希望 cookie 被盗,那就改用 https。
-
如果你是理智的,并不总是“清楚”
-
"会话 ID 可以像用户密码一样敏感" => 不一定。如果安全是一个问题,您可以(并且许多人确实)要求用户在执行真正敏感的操作之前重新进行身份验证。
标签: php mysql security session hash