2010-11-26 41 views
2

看来最流行的学派是随机生成会话ID,在用户登录时重新生成会话ID,并在现有用户登录时定期重新生成会话ID,只是为了提高安全性。

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

如果你可以看看下面的内容,告诉我它是如何被破坏的,我会很感激。

该脚本创建一个与用户机器绑定的会话ID,并始终保持相同。我正在考虑将当前日期包含在散列表中,但我们的夜班工作人员随后将在午夜退出。不是说我会听到他们的抱怨;)

我知道,使用IP地址会打开它滥用,如果两个用户使用相同的操作系统和浏览器坐在咖啡店,使用免费的WiFi,但是这是针对内部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. 
} 

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

回答

7

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

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

这并不重要,你只会减少PHP已经为你提供的安全性,试图推出自己的产品。

+0

还有我以为我很聪明。我完全明白你的观点,但认为PHP的内置会话并不安全。 – Kalessin 2010-11-27 11:33:55

1

内置机制应该适合您的需求。如果你坚持推出你自己的解决方案,我建议在数据结尾附加一段随机数据。生成这种随机数据的最佳方法是PHP的openssl_random_pseudo_bytes()-function

2

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

而且别忘了session_regenerate_id()