php中防止会话劫持的有效方法

php中防止会话劫持的有效方法,php,session,Php,Session,我读过关于如何在php中保护会话的文章,有一些,但它们并不像在会话中添加useragent、ip和端口并对它们进行加密那样有效。 防止会话劫持的好方法是什么? 我想采取以下步骤: 将PHPSESSID键全部更改为像id这样的通用键 每页生成令牌并将其放在页面上,然后验证它以及会话。这将减少我对单独会话进行验证的依赖 我将添加一个短会话到期 向会话id添加更多变量并对其进行加密,这样会使会话id更长、更难破解。也许我会使用RSA加密 放置一个注销按钮,以便用户能够终止其会话 使用javascrip

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

  • 将PHPSESSID键全部更改为像id这样的通用键
  • 每页生成令牌并将其放在页面上,然后验证它以及会话。这将减少我对单独会话进行验证的依赖
  • 我将添加一个短会话到期
  • 向会话id添加更多变量并对其进行加密,这样会使会话id更长、更难破解。也许我会使用RSA加密
  • 放置一个注销按钮,以便用户能够终止其会话
  • 使用javascript计算时间,超过5分钟将提醒用户继续其会话
  • 仅在cookies中保存会话
  • 我听到的困难是:当您使用每页令牌时,您需要禁用后退按钮吗?为什么呢

    还有几件事还不清楚?在数据库中保存会话是否更安全?为什么? 使用SSL有多安全?快速重新生成会话id怎么样,会有帮助吗

    什么样的系统可以防止暴力强制加密密钥(识别试图大量猜测会话id的用户的ip会有帮助吗?)

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

    更新 我想这样做: 使用密钥A对会话id进行对称加密 对随机生成的令牌进行对称加密,该令牌将与密钥一起位于post字段中

    随机生成的令牌也将附加到会话id,然后进行加密

    根据要求,我应该获得以下变量: $\u会话['PHPSESSID'](其中加密了随机生成的令牌) $\u POST['RandomlyGeneratedToken']

    使用密钥A解密会话id,并使用密钥B随机解密令牌。 进行两次检查: -检查令牌是否与发送的第一个请求上的令牌相同。 -检查sessionid中是否存在令牌

    黑客的可能性: -Bruteforce会话id。 我的会话id足够长,需要他花时间。我可以使用一个系统来检测来自同一ip、具有不同会话id的大量请求流,并使用睡眠功能来降低他的速度

    -窃听流量并从用户和令牌处获取会话id,然后尝试提交这些id。 隐马尔可夫模型。。。我必须在每次请求时重新生成会话id,并在某些页面上快速终止会话。可能需要1分钟。。 但他能以多快的速度窃听?

    “将PHPSESSID密钥全部更改为像id这样的通用密钥”

    这是通过模糊处理实现的安全性,并且是一个薄弱环节。用户只需查看他们的cookie并将其放在一起,会话id就可以绕过此设置

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

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

    “我将添加一个短会话到期。”

    这是个好主意,但这可能会影响那些在页面上停留很长时间,然后点击“刷新”按钮却发现自己注销得太快的用户

    “向会话id添加更多变量并对其进行加密,这样会使会话id更长、更难破解。也许我会使用RSA加密。”

    为什么使用RSA加密?为什么不用像沙这样的单方药来解决呢?不要忘记添加盐或初始载体

    放置注销按钮,以便用户能够终止其会话

    谁按过注销按钮?;-)

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

    “仅在Cookie中保存会话。”

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

    至于您的其他注释:您可以将会话变量存储在数据库中,这允许您检查其他内容,如ip地址等(尽管您可以使用自定义会话处理函数检查ip等:)。但是,如果您使用数据库并且过于频繁地重新生成会话ID(例如,每次加载页面),您会发现,如果用户快速点击“刷新”按钮,则ID的重新生成速度将快于服务器在数据库中更新它的速度,并且会话将丢失

    会话再生是如何工作的,旧会话密钥是否自动销毁

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

    我希望我的回答有些有用,但我建议遵循OWASP会话管理指南,以便您遵循最佳实践:

    编辑

    我不知道你说的代币是什么意思?您是指会话id中的令牌吗?这将提供什么价值? 您的令牌是会话变量吗?这是没有意义的,因为它的值存储在服务器端,其密钥是phpsessid,您正试图阻止其滥用

    另外,不要指望黑客不理解你的逻辑。如果他们想理解,他们会的

    最后,为什么你需要这么多的安全性(不要对此投反对票)?有一件事叫做足够好的安全性(如果你遵循某些标准)。您可能不需要保护免受外国政府黑客的攻击,否则您可能会将此项目外包。遵循易于谷歌搜索的教程或指南(如我上面提供的OWASP)中概述的最佳实践。足够了