似乎最流行的思想流派是随机生成会话ID,在用户登录时重新生成会话ID,并在现有用户登录时定期重新生成会话ID,这只是为了额外的安全性。
我正在使用另一个解决方案,但我不是一个经验丰富的PHP专家,我担心有一个明显的安全漏洞(或两个...或者更多)我可能错过了。
如果您能看一下下面的内容,并告诉我它可能会如何被攻破,我将不胜感激。
该脚本创建一个绑定到用户机器的会话ID,并始终保持不变。我在考虑将当前日期包含在散列中,但我们的夜班工人将在午夜注销。并不是说我会听到他们的抱怨;)
我确实意识到,如果两个操作系统和浏览器相同的用户坐在咖啡馆里,使用免费的WiFi,使用IP地址很容易被滥用,但这是为了内部管理信息系统,所以每个用户都有自己的静态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.
}欢迎和感谢所有有建设性的意见!
发布于 2010-11-27 02:26:32
我不会费心去创建您自己的会话ID。您的方法特别弱,因为在代理服务器的情况下,许多人将共享相同的远程主机、用户代理和远程地址。
使用PHP的内置会话,除非您找到一个特定的理由来避免使用它们。你没有给出任何迹象表明你有这样的理由。恰恰相反,正如您所说的,该系统是供内部使用的,在这种情况下,您的“增强”会话安全性甚至不那么重要。
你正在做什么其实并不重要,你只会通过尝试运行你自己的PHP来降低PHP已经提供给你的安全性。
发布于 2010-11-27 02:29:46
如果它们都有自己的静态IP,则将该IP存储在会话中,并在每次加载页面时进行比较。如果是$_SERVER['REMOTE_ADDR'] != $_SESSION['IP'],那就是有人想窃取会话。
别忘了session_regenerate_id()。
发布于 2010-11-27 02:29:18
内置的机制应该能满足您的需求。如果您坚持使用自己的解决方案,我建议在最后添加一个随机的数据片段。生成这种随机数据的最好方法是PHP的openssl_random_pseudo_bytes()-function。
https://stackoverflow.com/questions/4287678
复制相似问题