似乎最流行的思想是随机生成会话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.
}
欢迎并赞赏所有建设性意见!
答案 0 :(得分:7)
我不打算尝试创建自己的会话ID。您的方法特别弱,因为在代理服务器的情况下,许多人将共享相同的远程主机,用户代理和远程地址。
使用PHP的内置会话,除非您找到避免它们的特定原因。你没有表明你有这样的理由。恰恰相反,正如您所说的那样,系统是供内部使用的,其中您的家庭滚动“增强”会话安全性更不重要。
你正在做什么并不重要,你可能只会通过尝试自己来减少PHP已经为你提供的安全性。
答案 1 :(得分:2)
如果它们都有自己的静态IP,请将IP存储在会话中,并在每次加载页面时进行比较。如果$_SERVER['REMOTE_ADDR'] != $_SESSION['IP']
,有人试图窃取会话。
答案 2 :(得分:1)
内置机制应该适合您的需求。如果您坚持推出自己的解决方案,我建议您将随机数据添加到最后。生成此类随机数据的最佳方法是PHP openssl_random_pseudo_bytes()
-function。