为了防止会话劫持,我尝试根据以下变量为每个用户分配一个特定的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,相同的用户代理,然后相同的cookie名称!
这种方法很好,但不太安全。改变用户代理并不难,如果受害者和劫持者从Coffenets、public hotspots等公共网络连接,他们可能拥有相同的IP地址。
拒绝攻击者这样做很重要,尤其是如果我们使用"还记得我吗?">选项来生成持久的会话cookie
有人对这个问题有什么建议吗?
正如我所研究的,其中一个解决方案是使用SSL和安全cookie。但是,我正在寻找一个没有SSL使用的解决方案。
如果您的senario基于
1) 攻击者可以拥有相同的ip地址和2) 攻击者可以假装拥有相同的用户代理,因为他们可以访问通过网络传输的任何信息
那么您就无法验证此cookie的身份。这是因为你在假设中假设所有这些信息都是可用的。
您有两种解决方案:a) 使用SSLb) 相信你的用户不会和攻击者在同一家咖啡店,相信IP地址是有效的,相信你的网站还不够重要,不值得大规模攻击。他们还能做些什么?制造攻击性的帖子和垃圾邮件?无论如何,他们都可以用自己的账户做到这一点。
根据我的经验和我所读到的内容,我同意"过早优化是[编程的最大弊端之一]"的说法。把你的时间集中在建立一个对人们有用的网站上,然后,如果出现问题,考虑获得SSL证书。你只是没有钱买证书,也没有钱,因为你的网站还没有成功(所以先这么做)。
"过早优化"和偏执的安全措施对程序员来说是一种诱惑,因为我们喜欢认为自己在从事大规模、非常重要的项目,而我们还没有。