这会作为http cookie的替代品吗?

时间:2010-07-14 18:00:14

标签: php security session cookies

我正在使用php访问我的网站,并且如果使用$ _SERVER是个好主意的话 md5($ _ SERVER ['remote_addr'] + $ _SERVER ['http_user_agent']))进入用户表的cookie_auth字段。

当用户登录时,php将使用上面的密钥重新检查当前用户并将其与存储的密钥进行比较,如果匹配则获得用户的信用。

问题是,用户代理可以更改,IP可以更改。我想我主要关心的是用户用户代理。 IP地址通常会保留一两个月,而我的主要用户群有静态IP地址(公司),所以这不应该是问题。

是否还有其他的php $ _SERVER变种,我可以将它变得更加容易......但仍然是动态的?

我手边有php手册,但我没有看到任何有用的东西......也许我错过了什么。

其他开发人员是否实现了类似的内容?

思想?

有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:2)

它也不起作用,也因为代理。如果两个拥有相同用户代理的人访问,则会发生灾难。

有些项目可以通过在他们使用的所有网址中的GET变量中传递会话ID来执行“无Cookie会话”。

PHP实际上可以自己做到这一点。你甚至可以强制PHP not use cookies at all,只需将其传递给GET变量。

但是有一些缺点。如果您在javascript代码中调用应用程序的URL,则必须在其中插入会话ID。此外,如果存在外部链接,则可以通过引用(sic)HTTP参数将会话ID提供给第三方,这可能导致潜在的会话窃取。您必须格外小心XSS漏洞。您可能必须小心在应用程序的登录过程中发生会话固定。等等。

答案 1 :(得分:1)

  

我的主要用户群有静态IP地址(公司)

所以,如果一个人在MegaCorp(拥有所有相同的浏览器和相同的外部IP地址)中登录,那么每个人都登录了吗?不要这样做。

另一个原因是:同一区域内的所有iPhone(相同的代理,相同的浏览器)都已登录。我所要做的就是在几百米内(某些地方到几公里)到某人有访问权限,它自动授予我。

通常有2种方法可以进行“无密码登录”(这是大多数问题的起源):

  • 使用之前登录的“unguessable hash”足够的Cookie
  • 说服用户安装可以通过HTTPS验证的证书。

答案 2 :(得分:0)

大多数$_SERVER变量都是受攻击者控制的(remote_addr是直接从tcp套接字中提取的,因此不能被欺骗或以其他方式篡改)。但是,攻击者可以将用户代理更改为任何内容。

不要重新发明风团。 session_start()$_SESSION超全局是安全的,易于实施和强大的。要使用此功能,您应始终在所有页面的头文件中调用session_start()

if(!$_SESSION[logged_in]){
    header("location: login.php");
    die();//Yes php keeps executing so you need this!
}

然后在login.php中:

if(login($_REQUEST[user],$_REQUEST[password])){
    $_SESSION[logged_in]=true;
}