防止会话cookie劫持没有SSL

时间:2012-09-22 12:09:52

标签: php session session-cookies remember-me session-hijacking


为防止会话劫持,我尝试根据以下变量为每个用户分配一个特定的Cookie名称:用户代理 IP地址

我使用以下功能生成会话 Cookie名称,其中包含会话ID

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,相同的User-Agent,然后是相同的cookie名称!

这种方法很好但不太安全。更改用户代理并不是那么困难,如果受害者和劫持者从Coffenets,公共热点等公共网络连接,他们可能拥有相同的IP地址。

拒绝攻击者这样做很重要,特别是如果我们使用“记住我?”选项来生成持久的会话cookie。

有人对此问题有任何建议吗?

正如我研究的那样,其中一个解决方案是使用SSL和安全cookie。但是,我正在寻找一种没有SSL使用的解决方案。

1 个答案:

答案 0 :(得分:2)

如果你的假设基于

1)攻击者可以拥有相同的IP地址 和 2)攻击者可以假装拥有相同的用户代理,因为他们可以访问通过网络传输的任何信息

然后,您无法验证此Cookie的身份。这是因为您假设所有这些信息都可用。

您有两种解决方案: a)使用SSL b)相信您的用户不会与攻击者在同一个咖啡店,IP地址有效,并且您的网站还不够重要,不值得大规模攻击。他们还能做些什么 - 制作攻击性帖子和垃圾邮件?他们无论如何都可以用他们自己的账户做到这一点。

根据我的经验和我所读到的内容,我同意“过早优化是[编程最大的罪恶之一]”的说法。把时间集中在构建一个有效的网站,对人们有用,然后,如果出现问题,请考虑获取SSL证书。您只是没有钱获得证书,而且您没有钱,因为您的网站尚未成功(首先这样做)。

“过早优化”和偏执的安全措施是程序员的诱惑,因为当我们还没有时,我们会认为自己是在开展大规模,非常重要的项目。