1


为了防止会话劫持,我尝试根据以下变量为每个用户分配一个特定的 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 的解决方案。

4

1 回答 1

1

如果您将您的 senario 基于以下假设

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

那么您就无法验证此 cookie 的身份。这是因为您在假设中假设所有这些信息都是可用的。

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

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

“过早的优化”和偏执的安全措施对程序员来说是一种诱惑,因为我们喜欢认为自己在 [尚未] 从事大型、非常重要的项目时工作。

于 2012-09-22T15:46:37.090 回答