2012-03-04 63 views
0

所以我有几种不同的方法来尝试和防止会话劫持,一种使用HTTP_USER_AGENT并检测会话期间是否发生了更改。这里的问题是,如果一个用户进入该网站在手机上,并从移动视图更改到桌面视图,用户代理的变化和用户得到以下错误:会话劫持安全

if (isset($_SESSION['HTTP_USER_AGENT'])) 
{ 
    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) 
    { 
     echo "Error: security issue #1 (Please use contact us if recieving this error)"; 
     exit; 
    } 
} 
else 
{ 
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); 
} 

现在我仍然需要这个小小的安全层,但我不希望出现错误消息,并且我希望网站保持可供用户查看。我应该怎么做?

+0

为什么不使用SSL? – 01100110 2012-03-04 21:14:30

+1

“我想继续检查用户代理是否匹配,但有时如果用户代理不匹配,我希望它可以。 - 你确定这张支票实际上对你有用吗? – Amber 2012-03-04 21:19:41

+1

用户代理检查确实增加了绝对*无*安全性。如果您修复代码以根本不启用会话劫持,则可以删除该检查并确保您的用户获得更好的体验。如果你不这样做,反正你被搞砸了(而且Russion黑客会将你的网站打上:) – 2012-03-04 21:21:01

回答

1

用户在切换设备(而不是导致错误)时需要重新进行身份验证,然后您可以同时使用已验证的$_SESSION['HTTP_USER_AGENT']变量与将来的请求进行比较。

1

劫持一个会话,你需要知道它的ID。您可以通过猜测有效的会话ID或通过从客户端或服务器获取它来完成此操作。

前者很容易减轻:熵越多越好。

  • 偷听客户端和服务器
  • 泄露时通过URL(HTTP引用传送,日志文件之间的通信:但后者不能与作为会话ID可被暴露/上多种方式获得的只是一个度量来减轻等)
  • 跨站点脚本(XSS)

其中的一些可以是固定的相当简单:可以通过使用经由URL安全信道(即HTTPS)和泄漏可通过避免被避免窃听在cookie中传输会话ID(同时使用HttpOnly安全标志)。防止XSS是最难的,因为您必须在返回给客户端之前处理每个用户发起的输入数据。

但是,如果你这样做,你很好地防止会话劫持。至少可以控制为攻击者的部分可以直接从浏览器的cookie jar中获取cookie。但是这超出了你的范围。

0

问题背后的前提反映了一种误解。

用户代理不是防止会话劫持的有效方法。任何值得使用的攻击者都可以欺骗他们的用户代理来匹配被劫持的用户。这种防御通过默默无闻至多是安全的。

防止会话劫持的正确方法是使用适当的安全措施,如安全会话管理,站点范围的SSL,CSRF保护,正确的输入验证和输出转义,防止XSS等。 OWASP拥有一些保护Web应用程序的优秀资源。