如何让$ _SESSION更安全?

时间:2010-11-26 18:20:08

标签: php security session

似乎最流行的思想是随机生成会话ID,在用户登录时重新生成会话ID,并在他们登录时定期为现有用户重新生成会话ID,这只是为了提高安全性

我正在使用替代解决方案,但我不是经验丰富的PHP专家,而且我担心有一个明显的安全漏洞(或两个......或更多)我可能会丢失。

如果您可以查看以下内容并告诉我它可能会受到什么影响,我会很感激。

该脚本创建一个与用户计算机绑定的会话ID,并始终保持不变。我想在哈希中包含当前日期,但是我们的夜班工作人员会在午夜退出。并不是说我会听到他们的抱怨;)

我确实意识到,如果两个使用相同操作系统和浏览器的用户使用免费WiFi坐在咖啡店,使用IP地址会被滥用,但这是针对内部MIS的,所以每个用户都会拥有他们的拥有静态IP地址。如果他们后来决定让它从网上访问我就麻烦了!但这不是规范的一部分:)

// Set the session ID
$session_hash = md5( $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_HOST'] . $_SERVER['REMOTE_ADDR'] );
// Compare against session ID received from user
if ( session_id() != $session_hash )
{
    session_destroy();
    unset ( $_SESSION );
    session_id( $session_hash );
    session_start();
}
else
{
    // Attempt to load user details from database if $_SESSION['user_ID'] is set.
}

欢迎并赞赏所有建设性意见!

3 个答案:

答案 0 :(得分:7)

我不打算尝试创建自己的会话ID。您的方法特别弱,因为在代理服务器的情况下,许多人将共享相同的远程主机,用户代理和远程地址。

使用PHP的内置会话,除非您找到避免它们的特定原因。你没有表明你有这样的理由。恰恰相反,正如您所说的那样,系统是供内部使用的,其中您的家庭滚动“增强”会话安全性更不重要。

你正在做什么并不重要,你可能只会通过尝试自己来减少PHP已经为你提供的安全性。

答案 1 :(得分:2)

如果它们都有自己的静态IP,请将IP存储在会话中,并在每次加载页面时进行比较。如果$_SERVER['REMOTE_ADDR'] != $_SESSION['IP'],有人试图窃取会话。

不要忘记session_regenerate_id()

答案 2 :(得分:1)

内置机制应该适合您的需求。如果您坚持推出自己的解决方案,我建议您将随机数据添加到最后。生成此类随机数据的最佳方法是PHP openssl_random_pseudo_bytes()-function