为了防止会话劫持,我尝试根据以下变量为每个用户分配一个特定的 cookie 名称:用户代理和IP 地址。
我使用以下函数来生成包含会话 ID的会话cookie 名称。
static function getSessionName(){
$id= @md5(base64_encode(self::$secretToken.$_SERVER["HTTP_USER_AGENT"].$_SERVER["REMOTE_ADDR"]));
while(is_numeric($id{0})){
$id = substr($id, 1).$id{0};
}
return $id;
}
这意味着每个访问我的网站的用户都会有一个不同的会话 cookie 名称。它将阻止劫持者使用其他人的 cookie,除非他/她将他/她的用户代理更改为受害者的用户代理;并尝试以某种方式使用受害者的 IP 地址出现在线,例如使用用户的互联网调制解调器、路由器、NAT 等。
让我用一个例子来解释它。因此,如果两个用户使用相同的浏览器并从相同的 IP 地址连接,他们将获得相同的 cookie 名称(假设为 f5e30acc605e938b097dee73c0272470)。
现在,该脚本将在这两个客户端上的名为f5e30acc605e938b097dee73c0272470的 cookie 中查找会话 ID 。在这种情况下,其中一个客户端可以劫持其他客户端的 cookie。相同的 IP、相同的用户代理和相同的 cookie 名称!
这种方法很好,但不是很安全。更改用户代理并不难,如果受害者和劫持者从 Coffenets、公共热点等公共网络连接,他们可能拥有相同的 IP 地址。
拒绝攻击者这样做很重要,特别是如果我们使用“还记得我吗?” 生成持久会话 cookie 的选项。
有人对这个问题有什么建议吗?
正如我所研究的,其中一种解决方案是使用 SSL 和安全 cookie。但是,我正在寻找不使用 SSL 的解决方案。