2010-08-18 81 views
11

让我们考虑服务器对用户的信任。会话劫持和PHP

会话固定:为了避免我用的是固定 “session_regenerate_id()” 只有在认证(login.php中)

会议sidejacking:SSL加密整个站点。

我安全吗?

谢谢。

+0

它是什么类型的网站? – 2010-08-18 22:57:10

+9

@MrXexxed一个网站,开发人员不希望它被黑客入侵。 – rook 2010-08-18 23:43:30

+0

@The Rook,我和OP说话,这是一个真正的问题,你的评论既荒谬又完全无益。 – 2010-08-19 00:15:43

回答

28

阅读OWASP A3-Broken Authentication and Session Management。另请阅读OWASP A5-CSRF,有时称为“会议骑行”。

你应该在一个PHP头文件使用此代码:

ini_set('session.cookie_secure',1); 
ini_set('session.cookie_httponly',1); 
ini_set('session.use_only_cookies',1); 
session_start(); 

此代码防止session fixation。它也有助于防止xss访问document.cookie,这是Session Hijacking可能发生的一种方式。仅执行HTTPS cookie是解决OWASP A9-Insufficient Transport Layer Protection的好方法。这种使用HTTPS的方式有时被称为“安全cookie”,这是一个可怕的名字。另外STS是一个非常酷的安全功能,但并非所有的浏览器都支持它。

+1

你的答案至少应该有+10,并且在我的投票中你明白了。几个问题只是为了让我明白:1)'cookie_secure'会强制我在会话中始终使用https,不是吗?! 2)'cookie_httponly'做什么?我读了PHP的解释,但是当它说阻止JS表单读取cookie时,我没有得到,实际上Cookie应该在许多情况下被JS读取。谢谢,和FYI:自PHP 5.3.0'session.use_only_cookies'默认为1 http://it.php.net/manual/en/session.configuration.php#ini.session.use-only-cookies – 2011-04-29 16:07:58

2

我也建议在会话中存储用户代理和IP信息,并在每个请求中验证它。这不是防弹的,但它的鲁棒性有了相当大的提高。虽然UA锻造非常简单,但IP锻造虽然可能很难...但您可能会遇到诸如AOL用户等循环知识产权系统背后的用户问题...

+5

“ ip伪造“,或者更常见的称为ip欺骗,由于三次握手而不可能通过互联网进行TCP连接。但是,由于公司网络上的负载平衡器或更改无线热点,会话期间合法用户的IP地址可能会发生变化。 – rook 2010-08-19 00:40:24

+0

这很有可能。它只需要一个MITM风格的攻击(攻击者可以访问其中一个端点路由器,然后可以做他们想做的事情)...... – ircmaxell 2010-08-19 00:44:09

+1

如果您可以访问路由到该IP的数据包,则不会“伪造”。 – 2010-08-19 02:16:31

0

最佳实践我有没有发现是将会话数据保存到数据库或文本文件。 数据库将有用户代理和IP记录并检查它的每一个请求,以确保该会话永远不被其他人劫持。

例如会话保存在数据库中,您可以在codeigntier会话库中看到实现。在我看来,这种方式相当节省,以防止某人进行会话。

+3

检查用户代理是没有意义的,因为这是一个攻击者控制变量。在数据库中存储会话ID意味着SQL注入让攻击者立即访问系统,所以他不需要破解密码哈希来登录。检查IP地址很容易出错,因为这可能会在合法系统上更改,例如,如果他位于公司网络上的负载平衡器后面。 – rook 2010-08-19 05:17:41

+0

@Rook - 您假设数据库容易受到SQL注入的攻击。正确使用预先准备的语句或存储过程以及适当的参数卫生设置将不允许SQL注入。 – AgmLauncher 2013-11-03 21:23:27

+0

@AgmLauncher这相当于以明文形式在数据库中存储密码。一个人必须计划失败。 – rook 2013-11-03 22:17:48