php - php中保护 session 劫持的有效方法

标签 php session

我读过如何在 php 中保护 session ,有一些,但它们不像添加到 session 中的用户代理、IP 和端口并对它们进行加密那么有效。 防止 session 劫持的好方法是什么? 我想采取以下步骤:

  1. 将 PHPSESSID key 完全更改为 id 之类的通用 key
  2. 为每个页面生成 token 并将其放在页面上,然后验证它以及 session 。这将减少我对单独 session 进行验证的依赖。
  3. 我会添加一个短暂的 session 过期时间。
  4. 在 session ID 中添加更多变量并对其进行加密,这样会更长且更难破解。也许我会使用 RSA 加密。
  5. 放置一个注销按钮,以便用户能够终止其 session 。
  6. 使用javascript来计算时间,超过5分钟将提醒用户继续其 session 。
  7. 仅在 Cookie 中保存 session 。

我听到的困难是:当你在每页使用 token 时,你需要禁用后退按钮?这是为什么?

还有一些事情还不清楚吗?将session保存在数据库中是否更安全?为什么? 使用 SSL 有多安全?快速重新生成 session ID 怎么样,有帮助吗?

什么系统可以防止暴力破解加密 key (通过大量尝试猜测 session ID 来识别试图淹没服务器的用户的 IP 会有帮助吗?)?

session 再生是如何工作的,旧的 session key 是否会自动销毁,如果黑客获得了旧的 session key ,它仍然有效吗?请问,了解 session 安全对我来说很重要,因为我正在学习如何成为一名渗透测试人员?

更新 我想这样做: 使用 key A 对 session ID 进行对称加密 对随机生成的 token 进行对称加密,该 token 将在带有 key 的 post 字段中

随机生成的 token 也会附加到 session ID 中,然后进行加密。

根据要求,我应该获取这些变量: $_SESSION['PHPSESSID'] (随机生成的 token 已加密) $_POST['RandomlyGenerateToken']

使用 key A 解密 session ID,并使用 key B 解密随机 token 。 进行 2 项检查: - 检查 token 是否与发送的第一个请求上的 token 相同。 -检查sessionid中是否存在token。

黑客的可能性: - 暴力破解 session ID。 我的 session ID 足够长,这会花费他一些时间。我可以使用一个系统来检测来自同一 ip 具有不同 session id 的大量请求流,并通过 sleep 功能减慢他的速度。

-窃听流量并从用户处获取 session ID 和 token 并尝试提交这些内容。 嗯...我将不得不为每个请求重新生成 session ID,并在某些页面上快速使 session 过期..可能需要 1 分钟.. 但他窃听的速度有多快?

最佳答案

“将 PHPSESSID key 完全更改为 id 之类的通用名称”

这是通过混淆实现的安全性,并且是一个弱点。用户只需查看他们的 cookie 并将其放在一起用于 session ID 即可绕过此问题

“为每个页面生成 token 并将其放在页面上,然后验证它以及 session 。”

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

“我会添加一个短暂的 session 过期时间。”

好主意,但这可能会影响长时间停留在页面上然后点击刷新却发现自己过早注销的用户

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

为什么使用RSA加密?为什么不使用像 SHA 这样的单向算法对其进行哈希处理呢?不要忘记添加盐或初始化向量

“放置一个注销按钮,以便用户能够终止其 session 。”

谁曾经按下过注销按钮? ;-)

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

“仅在 cookie 中保存 session 。”

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

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

“ session 重新生成是如何工作的,旧的 session key 是否会自动销毁”

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

我希望我的回答有点用,但我建议遵循 OWASP session 管理指南,以便您遵循最佳实践: https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

编辑

我不确定你所说的 token 是什么意思?你的意思是 session ID中的 token 吗?这会提供什么值(value)? 您的 token 是 session 变量吗?这是没有意义的,因为它的值存储在服务器端,其关键是您试图防止其滥用的 phpsessid。

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

最后,为什么需要如此多的安全保障?存在足够好的安全性(如果您遵循某些标准)。您可能不需要防范外国政府黑客,否则您可能会外包这个项目。遵循易于在 google 上搜索到的教程或指南(例如我上面提供的 OWASP 指南)中概述的最佳实践。这就足够了:-)

编辑 “另外,你说最佳存储是数据库?那我描述的最后一个防止暴力破解的方法怎么样?”

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

阻止暴力攻击的两种方法是 1) 有一个很长的 session ID,2) 经常重新生成它

关于php - php中保护 session 劫持的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15446557/

相关文章:

php - 在 PHP 代码中,如何删除换行符

session - 无法初始化代理-没有 session (Grails运行时异常)

ruby-on-rails - 当我有并发请求时,我的 Rails session 正在重置

java - 请求之间的 session 不持久

java - hibernate中的 session 和 session 工厂

JSF 登录过滤器, session 为空

php - 如何通过相同的条件值连接另一个表中的值

javascript - PHP/JavaScript 中处理带有特殊字符的 URL

php - 迁移时未找到 Laravel fatal error 类

php - 如何将 get 字符串转换为 slug?