Php 在没有SSL的情况下防止会话cookie劫持

Php 在没有SSL的情况下防止会话cookie劫持,php,session,session-cookies,remember-me,session-hijacking,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})){


为了防止会话劫持,我尝试根据以下变量为每个用户分配一个特定的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名称。它将阻止劫机者使用他人的cookies,除非他/她将其用户代理更改为受害者的用户代理;并试图以某种方式使用受害者的IP地址在线显示,如使用用户的internet调制解调器、路由器、NAT等

让我用一个例子来解释一下。 因此,如果两个用户使用相同的浏览器并从相同的IP地址连接,他们将获得相同的cookie名称(假设f5e30acc605e938b097dee73c0272470

现在,脚本将在这两个客户端上名为f5e30acc605e938b097dee73c0272470的cookie中查找会话ID。在这种情况下,一个客户端可以劫持另一个客户端的cookie。相同的IP、相同的用户代理和相同的cookie名称

这种方法很好,但不太安全。改变用户代理并不难,如果受害者和劫机者从咖啡馆、公共热点等公共网络连接,他们可能拥有相同的IP地址

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

有人对这个问题有什么建议吗


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

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

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

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

您有两种解决方案: a) 使用SSL b) 请相信您的用户不会与攻击者在同一家咖啡馆,IP地址是有效的,并且您的站点还不够重要,不值得进行大规模攻击。他们还能做些什么——发布攻击性帖子和垃圾邮件?他们可以用自己的账户做这件事

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


“过早优化”和偏执的安全措施对程序员来说很有诱惑力,因为我们喜欢把自己想象成一个正在进行大规模、非常重要的项目的人,而我们[还没有]。

正如我所说,在这种情况下,cookie名称取决于两个因素,用户代理和IP地址。也许添加另一个依赖项可以解决问题……看看这篇文章:还有,当您从数据库输出数据时,不要忘记使用htmlentities()或strip_tags(),这将防止xss攻击(跨站点脚本)。劫持会话cookie最常见的技术是注入一些javascript来为您获取cookie。现在,如果您需要用户能够使用html(例如评论系统),那么您可以使用白名单来显示允许的标记。Manolis,谢谢您的建议。我已经对这个问题给予了足够的重视。我在一个公共可扩展项目上使用这种方法,不能保证每个想要扩展它的开发人员都会按照您所说的说明进行操作。所以,我决定假设我的饼干在不久的将来会被偷!这就是为什么我成为一个如此严格的程序员并问这个问题的原因!:)如果用户浏览器升级(UserAgent中的新版本)或用户具有动态IP,他将不得不再次登录。这个解决方案适合您吗?那么,您的意思是,如果不使用SSL,就无法使其安全?顺便说一句,在我的情况下,使其安全非常重要。因为它将用于一个真正的大型项目。我完全同意你关于“过早优化”的说法,但这个项目的工作不是这样的例子。是的。如果你能理解其中的原因——你假设所有进出服务器的流量都受到了影响,对吗?因此,您为用户编写的每一个函数都是已知的-您将如何将其发送给用户-并且它的输入将是已知的。。。因此,它的输出将是已知的。公钥密码术是这个问题的解决方案。。。但是,为什么你说这个项目会在你没有ssl资金的情况下大规模进行呢?什么需要如此安全?咖啡馆中的这些攻击者是谁?该项目可能不像您所说的那么大,但是,它将在许多服务器和主机上使用,并且所有用户可能无法支付SSL认证费用。你可以以Joomla为例。