PHP会话的风险是啥?

Posted

技术标签:

【中文标题】PHP会话的风险是啥?【英文标题】:What are the risks of PHP sessions?PHP会话的风险是什么? 【发布时间】:2011-03-14 13:11:06 【问题描述】:

所以大家都说session有安全风险,我想知道这些是什么风险?黑客可以用会话做什么?

这不是要知道如何避免攻击,我想知道黑客是怎么做的,他们在做什么。

我说的是php SESSIONS

【问题讨论】:

【参考方案1】:

主要有以下风险:

Session hijacking Session fixation

考虑使用 OWASP 来对付它。

也可以看看:

PHP Security Guide

【讨论】:

【参考方案2】:

sAc 的回答非常好。但是,不要因此排除“会话”。

我已经成功部署了自定义会话,其中包括修复劫持、密码反转(md5/rainbow)和(如果使用正确)会话修复。

“成功部署”是指通过了渗透测试,并且(当然)实际上比传统的要好。

没有“秘密”或晦涩难懂的安全性;基本上,它为每个用户帐户生成一个随机(和数据库唯一)数字(实际上,在我的情况下是一个 guid),并将 guid+用户名存储为正常方法(而不是用户名+散列/加盐密码)。接下来,它将这个 guid 与用户的 IP 地址绑定。并非万无一失,但使用 guid 和 per-ip 已经是对当前会话系统的改进。当然,在特定目标(例如 ip 欺骗+被劫持的 guid 和用户名)之后会出现漏洞。但总的来说,这是一种更好的选择。

【讨论】:

【参考方案3】:

这里有一个很好的讨论:http://phpsec.org/projects/guide/4.html

【讨论】:

【参考方案4】:

最大的风险是,如果 IP 未与会话关联,并且会话 ID 在未验证它们来自启动它们的 IP(或至少同一子网中的 IP)的情况下被接受。这允许某人发送一个链接到一个已经开始的会话,不知情的骗子可能需要登录。这样做后,SESSION 被认为已登录——并且发送链接的黑客(他已经拥有会话 ID ) 可以访问我们 rube 的帐户。或者它可能会发生相反的情况,用户已经登录并且没有启用 cookie,因此 PHPSESSID 值存储在每个链接中。如果用户将链接粘贴到某人,他们也有效地粘贴了对网站的访问权限。

为了防止这种情况发生,一个体面的网站会避免启动会话,直到其中存储一些内容,并跟踪会话的目标 IP。为了利用它,攻击者会寻找在主页的每个链接中发送 PHPSESSID 查询字符串值的站点,或者在索引页面上发送类似名称的 cookie。

【讨论】:

通过结合 IP 地址和会话 ID,您可能会遇到很多问题,尤其是 AOL 用户。 @Kieran Allen:通过在某种程度上不将它们结合起来,你可以让来自地球两端的两个人共享同一个会话,至少其中一个是在不知情的情况下进行的。在这种情况下,每个人都可以访问是一件的事情。当然,您可以稍微放宽对来自同一子网(地址块)的限制,正如我所提到的,但如果 AOL 用户可以同时来自网络的十几个不同部分,那么是的. AOL 用户将比现在更糟。 这是一个权衡。如果您对事物进行了足够的限制以确保安全,那么在使用 ROT13“加密”并来自 AOL 的 30 岁破烂浏览器中总会有一些白痴抱怨他们无法使用您的网站。您必须选择要走多远才能吸引访问者,以及是否值得您的网站更容易被黑客入侵。对于某些网站,安全性不值得麻烦......对于其他网站,它是。 cHao - 我不太明白你的意思。如果不是因为它存在巨大的安全漏洞,考虑到它的最小 cookie 大小约为 4k,MSIE 5 可以处理新的会话管理系统。加入 SSL 支持(从 MSIE2 开始),它已经比一些现代系统更安全。我并不是说 MSIE 更好,相反,如果 MSIE 做到了,其他人肯定会做得更好。 关键是,总会有人不愿意或无法遵守您制定的任何安全策略。你要么迎合他们,让你的网站更受欢迎,但不那么安全,或者你保持你的政策到位,告诉那些落后者屈服。 (出于这个原因,我并不是在谈论特定的浏览器:人们过于拘泥于细节。现在不要再关心 IE、Firefox、Lynx、Wget 等等。)问题是服务器的会话管理,而不是客户端的管理.除了向服务器传递 cookie 之外,客户端甚至不应该处理会话。【参考方案5】:

PHP 会话使用会话标识符,并且 haxxor 可以尝试所有可能的标识符,只需稍加更改即可获得有效标识符。此外,这些标识符存储在 cookie 中并且可以被拦截。第三种可能性是 PHP 可能有问题并创建两个具有相同标识符的会话。此外,会话数据存储在磁盘上的文件中,这是不安全的。相反,数据库需要密码。

前两个原因实际上是无法避免的,但是第三个和第四个原因是可以的。例如,将会话数据存储在数据库中。

【讨论】:

会话 ID 的长度为 128 位。这足够大,以至于您无法在太阳熄灭之前尝试所有可能的 ID。 @cHao - 我不会指望这个,但它仍然是一个长期的估计。 @Christian:我计算过。如果每秒尝试 10 亿次,尝试所有可能的 128 位 ID 需要 10782602312994018449800 年。即使考虑到您试图在给定计算机上找到已使用的十亿个 ID 中的一个(当然,假设会话的文件还没有被删除),仍然需要大约一万亿年才能找到找一个,除非你是那种工作中彩票的人。

以上是关于PHP会话的风险是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中会话名称的限制是啥?

为多个主机上的 PHP 站点处理会话的最佳方法是啥? [关闭]

登录中国银行个人网银时提示会话失效是啥意思

php在会话中存储用户ID?

在 Django 中不循环会话密钥有啥风险?

PHP编程语言中的socket是啥东西