2011-08-21 151 views
2

我正在做一些研究,在计算器上关于如何正确设置会话和阻止劫持等我找到了答案,有人张贴在的问题之一,他提供了下面的代码:PHP会话安全问题

因为当用户登录和用户名和密码匹配

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR']); 

如果用户已登录,对受保护的页面检查:

if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR'])) {  
     session_destroy(); 
     header('Location: login.php'); 
     exit();  
    } 

这似乎很好地工作,但我的问题是:有多安全这一点,这是一个很好的方法,或者我应该试试别的?该帖子没有upvotes或任何东西,所以不知道它是否好。

而且,不知道如何获取有关该会话的用户信息...我需要在数据库中存储什么吗?

谢谢!

+0

使用IP地址有它自己的问题。动态IP通常可以改变。如果您需要安全的解决方案,那么我认为使用HTTPS更好。 – Karolis

回答

3

此代码有两个主要问题。

1)IP地址更改正当理由。如果客户端位于负载均衡器之后,就像公司网络一样,那么他将无法使用您的Web应用程序。

2)检查用户剂是像具有一个get变量说?is_hacker=false了很多。如果黑客拥有会话ID,那么他有用户代理和它的微不足道的恶搞。

进一步我不知道你为什么会想这样做一个纯文本的比较时使用MD5这实际上是更安全的。因为用户代理是第一个攻击者可以使用md5前缀攻击产生冲突,并在那里绕过REMOTE_ADDR检查。 (A有用的MD5碰撞攻击不上来过于频繁,但是这一个很有趣!)

即使该检查到位CSRF和XSS仍然可以用来影响该会话。 XSS可用于读取CSRF令牌,然后使用XHR发出攻击者希望的任何请求。有人可能会认为这是为了减轻OWASP a9,但确实需要使用SSL来保护会话ID。

+1

后一项不一定为真:会话ID可能是从受害者在没有用户代理ID的情况下发布的URL获得的。 CSRF攻击不依赖于会话,也可能发生在其他身份验证技术上。 – Gumbo

+0

@ Gumbo♦对于一个他使用$ _SESSION的人,所以在某个地方有一个会话ID。默认情况下,php对sessoin id使用cookie,但不能保证他使用的是默认值。除此之外,用户代理也比密码更容易暴力破解。如果它的铬,那么它将永远是最新版本,等等。 – rook

+0

@ Gumbo♦另外,我正在与一家美国主要公司的客户服务部门交谈,他们为我打印了一些信息。页面底部是URL,因为它是从浏览器打印的,其中包括jsessionid。谈论一个糟糕的应用程序设计。 – rook

0

这看起来像一个很好的方法,但是指纹哈希是由客户端数据生成的,这可能是欺骗性的。用于登录表单的一个好方法是生成随机令牌,该令牌存储在会话中并通过表单传递。一旦令牌被验证(或不),它应该是未设置的一次性使用而已。

一旦用户登录,会话还应该存储用户ID,以检索存储在数据库中的用户信息。

+0

您正在讨论CSRF保护的常用方法。你正在比较苹果和橘子。 – rook

0

我同意Rook的评论,这是对你的代码的很好的分析。

有很多事情要考虑,以确保PHP会话,但与最新版本的PHP这并不难实现,有些事情要考虑: - 会话文件存储在您的服务器(主要是一个问题,如果它是共享服务器) - 在客户端之间使用所有敏感数据和cookie的安全连接&服务器 - 尽你所能在客户端安全地创建cookie会话ID - 不在会话变量中存储任何敏感数据

至于存储在数据库中的东西取决于您的需求,但我会说你可能不需要它并在会话中存储数据变量对安全性来说很好,就像我已经说过的那样,不要在那里存储任何敏感内容。从其他位置检索敏感数据,最有可能是数据库。

如果您需要了解更多关于PHP session security I've got a series of blog posts on the subject