在php中保护会话劫持的有效方法

时间:2013-03-16 07:06:14

标签: php session

我读过如何保护php中的会话,有一些,但它们不像在会话中添加useragent,ip和port并加密它们那样有效。 什么是防止会话劫持的好方法? 我想采取以下步骤:

  1. 将PHPSESSID密钥完全更改为通用内容,例如id
  2. 每页生成令牌并将其放在页面上,然后验证它以及会话。这将减少我对会话的依赖以进行验证。
  3. 我会添加一个短暂的会话到期时间。
  4. 向会话ID添加更多变量并对其进行加密,因此它会更长,更难破解。也许我会使用RSA加密。
  5. 点击退出按钮,以便用户可以终止他的会话。
  6. 使用javascript计算时间,超过5分钟将提醒用户继续他的会话。
  7. 仅在Cookie中保存会话。
  8. 我听到的困难是:当你每页使用令牌时,你需要禁用后退按钮吗?那是为什么?

    其他一些事情也不清楚?保存数据库中的会话更安全吗?为什么? 使用SSL有多安全?如何快速重新生成会话ID,它会有帮助吗?

    什么系统会阻止暴力破解加密密钥(将识别尝试通过大量尝试猜测会话ID的服务器泛滥的用户的IP会有帮助吗?)

    会话重新生成如何工作,旧的会话密钥是否自动销毁,如果黑客获得旧的会话密钥,它仍会有效吗?请理解会话安全对我很重要,因为我正在学习如何成为一名渗透测试员?

    更新 我想这样做: 使用密钥A对会话ID进行对称加密 对随机生成的令牌进行对称加密,该令牌将位于带有键

    的帖子字段中

    随机生成的令牌也将附加到会话ID,然后加密。

    根据要求,我应该得到这些变量: $ _SESSION ['PHPSESSID'](在其中加密随机生成的令牌) $ _POST ['RandomlyGeneratedToken']

    使用密钥A解密会话ID并使用密钥B随机解密令牌。 做2检查: - 如果令牌与发送的第一个请求上的令牌相同,则检查令牌。 - 检查令牌是否存在于sessionid中。

    黑客的可能性: -Bruteforce会话ID。 我的会话ID足够长,需要时间。我可以使用一个系统来检测来自具有不同会话ID的相同ip的大量请求,并使用睡眠功能减慢它的速度。

    - 窃听流量并从用户获取会话ID以及令牌并尝试提交。 嗯......我将不得不用每个请求重新生成会话ID,并在某些页面上快速过期会议。可能是1分钟.. 但是他能以多快的速度窃听?

1 个答案:

答案 0 :(得分:5)

“将PHPSESSID密钥完全更改为通用内容,例如id”

这是通过混淆实现的安全性,也是一种弱点。用户只需要查看他们的cookie并将用于会话ID的内容放在一起以绕过此

“每页生成令牌并将其放在页面上然后验证它以及会话。”

这是一个有趣的想法。但如果用户打开多个页面怎么办?你能支持多个令牌吗?令牌什么时候到期?

“我会添加一个短暂的会话到期时间。”

好主意,但这可能会影响长时间停留在页面上然后点击刷新但发现他们很快就会退出的用户

“在会话ID中添加更多变量并对其进行加密,因此它会更长,更难破解。也许我会使用RSA加密。”

为什么要使用RSA加密?为什么不像SHA这样的单向哈希呢?不要忘记添加盐或初始化载体

“点击退出按钮,以便用户可以终止他的会话。”

谁曾点击退出按钮? ; - )

“使用javascript计算时间,超过5分钟将提醒用户继续他的会话。”

YES

“仅在Cookie中保存会话。”

不要这样做,始终保存数据服务器端。 cookie可以在客户端存储时进行操作

至于你的其他评论:你可以将你的会话变量存储在数据库中,这可以让你检查其他东西,比如ip地址等(虽然你可以检查ip等自定义会话处理函数:{{3} })。但是,如果您使用数据库并且过于频繁地重新生成会话ID(例如,每次加载页面),您会发现如果您的用户快速点击刷新按钮,则ID将比服务器在数据库中更新它更快地重新生成会话将会丢失。

“会话重新如何工作,旧会话密钥是否自动销毁”

是,除非您编写自定义代码,否则它取决于您的自定义代码

我希望我的答案有些用处,但我建议遵循OWASP会话管理指南,以便您遵循最佳做法: http://php.net/manual/en/session.customhandler.php

修改

我不确定令牌是什么意思?你是说在会话ID中的令牌?它会提供什么价值? 您的令牌是会话变量吗?这是没有意义的,因为它的值存储在服务器端,关键是你试图阻止它的滥用的phpsessid。

此外 - 永远不要指望黑客不理解你的逻辑的能力。如果他们想了解它,他们会。

最后,为什么你需要这么多的安全性(不要为此投票)?有足够好的安全性(如果你遵循某些标准)。您可能不需要保护免受外国政府黑客攻击,否则您可能会将此项目外包出去。遵循简单的Google搜索教程或指南中列出的最佳做法,例如我在上面提供的OWASP。这就足够了:-)

修改 “另外,你说最佳存储是数据库?我描述的最后一种方法是什么呢?

数据库会话存储不一定是最佳的。您需要时使用它,例如当您负载平衡需要共享会话数据的多个Web服务器时。

阻止暴力攻击的两种方法是:1)拥有一个非常长的会话ID,以及2)经常重新生成它