2010-12-09 73 views
1

在阅读PHP会话安全性的好文章后,我有两个问题来自讨论。 1)$ _ SERVER ['HTTP_USER_AGENT'] - 这样可以获得关于用户浏览器和其他细节的信息,并且由于用户可以从另一台计算机访问他们的帐户,那么它有用吗?

2)session_regenerate_id - 这将重新生成会话ID,我应该如何使用它? session_id在会话超时或关闭后是否被删除?

感谢您的所有帮助。我感谢每一个观点和回应。

+0

HTTP_USER_AGENT对于会话/安全性来说并不是真正有用的。 – Jonah 2010-12-09 20:07:29

+0

感谢您的评论。我明白了。 – 2010-12-09 20:47:16

回答

4

$ _SERVER ['HTTP_USER_AGENT'],当您使用可能不适用于所有人的特殊功能,或者想要了解其目标受众时,可以使用此信息。当使用get_browser()函数查找有关浏览器功能的更多信息时,这也很重要。通过获取这些信息,用户可以被引导到最适合他们浏览器的网站版本。

session_regenerate_id,当它重命名会话ID时,它不会删除旧会话,使其保持活动状态,并且可能会被黑客使用。如果仅在新会话创建过程中使用该函数作为防止会话固定的手段,这不会造成问题,这是预期用途btw。但是,如果在基于每个基于会话的请求上使用它以防止会话泄漏(通过HTTP_REFERER和类似请求),那么它将完全无用,因为之前的会话标识仍然可用。这也意味着改变“行动”的id作为一些脚本来防止会话盗窃也是毫无意义的;实际上,它使同一用户的会话id数量增加了一倍,使得它更容易承担他们的身份。此外,这意味着在每次调用函数时,会话条目的数量都会重复,这些条目会一直存在,直到它们被垃圾收集过程视为已过期并被删除。

3

用户代理对确定正在使用的浏览器很有用,这可能导致猜测其某些功能。例如,大多数移动设备都可以通过其浏览器的用户代理准确识别(请参阅WURFL),从而允许网站的开发人员将移动设备指向网站的移动版本。

但是,它可以由用户修改,所以它的价值应该与任何用户输入的情况一样。

session_regenerate_id()不会删除会话。它只是将其ID改为新创建的一个。为避免系统自动删除旧会话文件,可以通过将optional function parameter设置为true将其自行删除。其用途是避免session fixation attacks,攻击者可以通过知道并向服务器呈现其id来访问现有会话的数据。

+0

Thanks.Your answer is enlightening。 – 2010-12-09 20:49:06

3

1)会话不绑定到帐户,它们绑定到浏览器会话。您可以使用用户代理信息来查看其他用户代理是否试图劫持会话。然而,这不是防错的。您还可以使用用户的IP地址(或其给定范围)来抓取劫持企图。

2)通过不时拨打session_regenerate_id,您可以减少某人劫持会话的可能性。如果会话ID在URL中传递,则尤其如此。例如,假设某人不小心将链接粘贴到URL中与SID聊天。如果您定期重新生成会话ID,那么看到该链接的用户不能劫持会话,因为ID已经更改。

1

我会尝试从下往上回答你的问题:session_regenerate_id()在防止会话修复攻击方面很有用,其中获得会话ID的恶意用户劫持你的会话,然后可以像你一样行事。当您重新生成会话时,您可以跟踪数据库或类似的最新会话ID,并且只允许使用最新的会话ID进行访问(顺便说一句,如果您足够频繁地重新生成sessid,这将阻止用户使用多个浏览器浏览器/窗口),否则旧会话将默认可用(除非将true布尔参数传递给session_regenerate_id函数调用)。

一些安全疯狂的人会建议在每次请求后重新生成会话ID,但是您也可以跟踪一个会话变量,每个请求递增一次,并且每重发X次请求(5次或10次或任何您确定的是足够的金额用于您的安全级别)。另一个选项是在特权升级期间(例如登录)重新生成会话ID。

对于HTTP_USER_AGENT,它主要用于实现浏览器/客户端特定功能(例如,显示“Get Chrome!”)。用户使用Firefox或IE访问您的网站时链接)。

相关问题