PHP中的$ _SERVER ['HTTP_USER_AGENT']和session_regenerate_id

时间:2010-12-09 19:54:21

标签: php session sessionid user-agent

阅读了关于PHP会话安全性的精彩帖子。我在讨论中有两个问题。

1)$ _ SERVER ['HTTP_USER_AGENT'] - 这可以获取有关用户浏览器和其他详细信息的信息,因为一个人可以从另一台计算机访问他们的帐户,那么它有用吗?

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

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

4 个答案:

答案 0 :(得分:4)

$ _ SERVER ['HTTP_USER_AGENT'],您可以在使用可能不适合所有人的特殊功能时使用此信息,或者如果他们想了解目标受众。当使用get_browser()函数查找有关浏览器功能的更多信息时,这也很重要。通过提供此信息,用户可以被定向到最适合其浏览器的站点版本。

session_regenerate_id,当它重命名会话ID时,它不会删除旧会话,使其保持活动状态并可能被黑客使用。如果仅在新会话创建期间使用该功能作为防止会话固定的手段(这是预期用途btw),则这不会造成问题。但是,如果在每个基于会话的请求上使用它以防止会话泄漏(通过HTTP_REFERER等),它会完全无用,因为前一个会话ID仍然可用。这也意味着更改“动作”上的id作为一些脚本来防止会话被盗也是没有意义的;事实上,它为同一个用户增加了会话ID的数量,使得假设自己的身份变得更加简单。此外,这意味着在每次调用函数时,会有多个会话条目重复,直到它们被认为已过期并被垃圾回收过程删除。

答案 1 :(得分:3)

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

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

session_regenerate_id()不会删除会话。它只是将其id更改为新创建的id。为避免旧的会话文件在系统自动删除之前暂停,您可以通过将optional function parameter设置为true来自行删除它。它的用途是避免session fixation attacks攻击者通过了解并向服务器提供其ID来访问现有会话的数据。

答案 2 :(得分:3)

1)会话不绑定到帐户,它们绑定到浏览器会话。您可以使用用户代理信息来查看其他用户代理是否正在尝试劫持会话。然而,它不是故障证明。您还可以使用用户的IP地址(或其给定范围)来捕获劫持尝试。

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

答案 3 :(得分:1)

我将尝试自下而上回答您的问题:session_regenerate_id()可用于防止会话固定攻击,其中获取会话ID的恶意用户劫持您的会话,然后可以像您一样行事。重新生成会话时,您可以跟踪数据库中的最新会话ID或类似内容,并且只允许使用最新的会话ID进行访问(顺便说一句,如果您经常重新生成sessid,这将阻止用户使用多个浏览您的站点浏览器/窗口),否则默认情况下旧会话可用(除非您将boolean true参数传递给session_regenerate_id函数调用)。

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

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