PHP 会话固定/劫持

2023-12-20

我正在尝试更多地了解 PHP会话固定 https://www.owasp.org/index.php/Session_fixation以及劫持以及如何预防这些问题。我在 Chris Shiflett 的网站上阅读了以下两篇文章:

  • 会话固定 http://shiflett.org/articles/session-fixation
  • 会话劫持 http://shiflett.org/articles/session-hijacking

但是,我不确定我是否正确理解了事情。

为了帮助防止会话固定,调用是否足够session_regenerate_id(true);成功登录某人后?我想我的理解是正确的。

他还谈到了使用通过 url 传递的令牌$_GET以防止会话劫持。具体该怎么做呢?我猜当有人登录时,您会生成他们的令牌并将其存储在会话变量中,然后在每个页面上将该会话变量与$_GET多变的?

这个令牌是否只需要在每个会话或每个页面加载时更改一次?

还有一种无需在 URL 中传递值即可防止劫持的好方法吗?这样会容易很多。


好的,有两个独立但相关的问题,每个问题的处理方式都不同。

会话固定

这是攻击者显式设置用户会话的会话标识符的地方。通常在 PHP 中,这是通过给他们一个像这样的 url 来完成的http://www.example.com/index...?session_name=sessionid。一旦攻击者将 url 提供给客户端,攻击就与会话劫持攻击相同。

有几种方法可以防止会话固定(全部执行):

  • Set session.use_trans_sid = 0 https://www.php.net/manual/en/session.configuration.php#ini.session.use-trans-sid在你的php.ini文件。这将告诉 PHP 不要在 URL 中包含标识符,并且不要读取 URL 中的标识符。

  • Set session.use_only_cookies = 1 https://www.php.net/manual/en/session.configuration.php#ini.session.use-only-cookies在你的php.ini文件。这将告诉 PHP 永远不要使用带有会话标识符的 URL。

  • 只要会话状态发生变化,就重新生成会话 ID。这意味着以下任何一项:

    • 用户认证
    • 在会话中存储敏感信息
    • 更改有关会话的任何内容
    • etc...

会话劫持

攻击者可以在这里获取会话标识符,并能够像该用户一样发送请求。这意味着,由于攻击者拥有标识符,因此他们与服务器上的有效用户几乎无法区分。

您无法直接阻止会话劫持。然而,您可以添加一些步骤来使其变得越来越难以使用。

  • 使用强会话哈希标识符:session.hash_function https://www.php.net/manual/en/session.configuration.php#ini.session.hash-function in php.ini。如果 PHP session.hash_function = 1对于 SHA1。如果 PHP >= 5.3,则将其设置为session.hash_function = sha256 or session.hash_function = sha512.

  • 发送强哈希:session.hash_bits_per_character https://www.php.net/manual/en/session.configuration.php#ini.session.hash-bits-per-character in php.ini。将其设置为session.hash_bits_per_character = 5。虽然这并不能解决任何问题harder为了破解,当攻击者试图猜测会话标识符时,它确实会产生影响。 ID 会更短,但使用更多字符。

  • 设置附加熵session.entropy_file http://www.php.net/manual/en/session.configuration.php#ini.session.entropy-file and session.entropy_length http://www.php.net/manual/en/session.configuration.php#ini.session.entropy-length在你的php.ini文件。将前者设置为session.entropy_file = /dev/urandom后者是将从熵文件中读取的字节数,例如session.entropy_length = 256.

  • 更改默认 PHPSESSID 的会话名称。这是通过调用来完成的session_name() https://www.php.net/manual/en/function.session-name.php在调用之前使用您自己的标识符名称作为第一个参数session_start.

  • 如果你是really偏执的您也可以轮换会话名称,但请注意,如果您更改此名称(例如,如果您使其依赖于时间),则所有会话都将自动失效。但根据您的用例,这可能是一个选择......

  • 经常轮换您的会话标识符。我不会对每个请求都这样做(除非你really需要那种安全级别),但间隔是随机的。您希望经常更改此设置,因为如果攻击者确实劫持了会话,您不希望他们能够使用它太长时间。

  • 包括用户代理来自$_SERVER['HTTP_USER_AGENT'] http://php.net/manual/en/reserved.variables.server.php在会议中。基本上,当会话开始时,将其存储在类似的内容中$_SESSION['user_agent']。然后,在每个后续请求中检查它是否匹配。请注意,这可能是伪造的,因此它不是 100% 可靠,但总比没有好。

  • 包括用户的IP地址来自$_SERVER['REMOTE_ADDR'] http://php.net/manual/en/reserved.variables.server.php在会议中。基本上,当会话开始时,将其存储在类似的内容中$_SESSION['remote_ip']。对于某些为其用户使用多个 IP 地址的 ISP(例如 AOL 过去的做法),这可能会出现问题。但如果你使用它,它会安全得多。攻击者伪造 IP 地址的唯一方法是在真实用户和您之间的某个时刻破坏网络。如果他们破坏了网络,他们的行为可能比劫持更糟糕(例如 MITM 攻击等)。

  • 在会话中和浏览器端包含一个您经常递增和比较的令牌。基本上,对于每个请求$_SESSION['counter']++在服务器端。也在浏览器端用 JS 做同样的事情(使用本地存储)。然后,当您发送请求时,只需获取令牌的随机数,并验证该随机数在服务器上是否相同。通过这样做,您应该能够检测到被劫持的会话,因为攻击者没有确切的计数器,或者如果他们有,您将有 2 个系统传输相同的计数,并且可以判断其中一个是伪造的。这并不适用于所有应用程序,但它是解决该问题的一种方法。

关于两者的注释

会话固定和劫持之间的区别仅在于会话标识符如何被泄露。在固定中,标识符被设置为攻击者事先知道的值。在劫持中,它要么是被猜测的,要么是从用户那里窃取的。否则,一旦标识符被泄露,两者的效果是相同的。

会话 ID 重新生成

每当您使用重新生成会话标识符时session_regenerate_id https://www.php.net/manual/en/function.session-regenerate-id.php应删除旧会话。这在核心会话处理程序中透明地发生。然而有些自定义会话处理程序使用session_set_save_handler() https://www.php.net/manual/en/function.session-set-save-handler.php不要这样做,并且容易受到旧会话标识符的攻击。如果您使用自定义会话处理程序,请确保跟踪您打开的标识符,如果它与您保存的标识符不同,请明确删除(或更改)旧标识符上的标识符。

使用默认的会话处理程序,您只需调用即可session_regenerate_id(true)。这将为您删除旧的会话信息。旧 ID 不再有效,如果攻击者(或任何其他人)尝试使用它,将导致创建新会话。不过要小心自定义会话处理程序......

销毁会话

如果您要销毁会话(例如注销时),请确保彻底销毁它。这包括取消设置 cookie。使用session_destroy https://www.php.net/manual/en/function.session-destroy.php:

function destroySession() {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
    session_destroy();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 会话固定/劫持 的相关文章

  • PHP 如何判断用户是否按下了 Enter 键或 Submit 按钮?

    我遇到的问题是我在一个表单中有多个提交输入 每个提交输入都有不同的值 我更愿意将它们保留为提交 Whenever the user presses Enter it is as though the topmost submit input
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • PHP 会话不适用于游戏

    我正在尝试模仿一款名为 SKUNK 用骰子玩 的游戏来完成一项作业 我无法让会话正常工作 这是我第一次使用 PHP 我还被告知无需会议即可完成 这是我的代码
  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 检查 PHP 中“@”字符后面的单词

    我现在正在制作一个新闻和评论系统 但是我已经在一个部分上停留了一段时间了 我希望用户能够在 Twitter 上引用其他玩家的风格 例如 用户名 该脚本看起来像这样 不是真正的 PHP 只是想象脚本 3 string I loved the
  • Woocommerce 让产品显示在存档页面中

    我正在尝试让所有产品显示在我商店的存档页面中 我想知道他们的id我正在使用我的一个钩子 它在 wp head 上运行并检查 if is product category 我想以某种方式访问 产品的查询并获取它们的 ID if is prod
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • 从 .phar 存档中提取文件

    对于 Phar 文件 我完全错过了一些东西 我正在安装一个需要 phpunit pdepend 和其他依赖项的项目 我将它们作为 phar 文件获取 但是 我无法使用命令行工具 php 命令 从中提取文件 我用谷歌搜索了这个问题 但没有发现
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • Doctrine EntityManager 清除嵌套实体中的方法

    我想用学说批量插入处理 http doctrine orm readthedocs org en latest reference batch processing html为了优化大量实体的插入 问题出在 Clear 方法上 它表示此方法
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主

随机推荐

  • 重命名 ng-include 中的变量[重复]

    这个问题在这里已经有答案了 这是相关的html
  • 为什么我的 iOS 应用程序不禁用深色模式?

    所以 我尝试根据苹果文档将我的应用程序设置为通过强制浅色模式来禁用iOS 13深色模式 在模拟器中所有尝试都工作正常 但是当我在真实设备上尝试时 没有任何反应 就像我 我从未改变过我的代码 第一次尝试 覆盖窗口 视图或视图控制器的界面样式
  • 使用 Qt-Designer 自动扩展布局

    我正在使用 Qt 设计器 我想创建一个QVBoxLayout它将自动扩展以填充整个窗口 的布局QVBoxLayout保持固定 我怎样才能导致QVBoxLayout通过设计器扩大并充满整个窗口 创建您的后QVBoxLayout在 Qt Des
  • Latex - 提取子字符串/忽略字符

    我有以下问题 我定义了一个宏 func如下 newcommand func 1 do something with 1 X 1 Y 我现在想定义另一个宏 newcommand MyFunc 1 parse 1 and if it conta
  • 如何在 d3.js 转换中正确更新输入元素的文本值

    我一直在尝试 一步一步 转换一些非常好的但静态的和非 d3code https github com saebekassebil teoria tree master examples用于 d3 js 可视化中的动态动画 虽然与这个问题没有
  • 避免竞争条件?操作员

    是否 可用于调用委托或事件的运算符避免竞争条件 例如 手动避免竞争条件 The event invoking method that derived classes can override protected virtual void O
  • 为什么快速排序比基数排序更流行?

    为什么快速排序 或介绍排序 或任何基于比较的排序算法比基数排序更常见 特别是对于数字排序 基数排序不是基于比较的 因此可能比 O n日志 其实还可以n 其中 k 是用于表示每个项目的位数 并且内存开销并不重要 因为您可以选择要使用的存储桶的
  • 需要好的 RDLC(报告)示例/样本 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 有条件地派生 Show 以获取在类型构造函数上参数化的存在类型

    假设我有这样的数据类型 LANGUAGE RankNTypes data X a forall b Show b gt X a b 我想导出Show X a 但当然我只能在有实例的情况下这样做Show a b 我很想写 LANGUAGE S
  • Django迁移找不到GDALRaster

    我接手了一个使用 Django Django REST 框架和 Leaflet 的项目 将绘制的路径存储在数据库中 在中安装 Djangovirtualenv并尝试迁移它会引发 文件 D SHK ElektroClean venv lib
  • Asp.net何时终止后台线程?

    我正在开发一个项目 有大量电子邮件发送其中的一部分 当用户单击按钮时 他 她会立即收到 感谢电子邮件已发送 作为响应 并且会触发相同的方法还有一个异步线程 ThreadPool QueueUserWorkItem SendEMail mes
  • 作业 - 尝试计算两个城市之间的多个航班停靠点?

    这是针对数据库类 使用 Oracle DB 11g Tables Flight flt no from city to city flt distance flt departs flt arrives flt price Aircraft
  • Delphi XE2无限等待线程中调用哪个等待方法

    如果我有一个 While not terminated do begin doStuff end 在 Delphi XE2 线程的执行方法中循环 我不想让它让我所有的失败 我该怎么称呼 在 Delphi 7 中 这很简单 我调用 Sleep
  • 如何在 Perl 中从终端进行管道传输而不丢失颜色?

    我正在尝试编写一个 perl 脚本 它获取 colorgcc 的输出 或任何其他将彩色文本打印到终端的脚本 添加 删除字符串的一部分 然后将结果打印在same颜色作为输入字符串 以下代码将在生成的每一行前面打印 Hello World 颜色
  • iOS itunesconnect 沙箱测试账户(无效年份)

    这太奇怪了 上周我创建了一个测试用户帐户 一切都很好 但今天 它要求我添加出生年份 正如您在下面的屏幕截图中看到的那样 没有年份字段要填写 它却要求填写 苹果 你是认真的吗 如果我做错了什么 请告诉我 UPDATE 看来这是苹果页面上的一个
  • 如果未实现功能,则在链接时启用错误

    我注意到 当使用 G 链接项目时 如果有已声明但未实现的函数 则不会出现错误 除非我尝试调用它们 Q1 如果声明了函数但未实现 是否可以启用错误 或至少警告 Q2 为什么会有这种行为 Note 我在用G 4 7 0 ld 2 22如果那是
  • 标题中的离子导航选项卡

    嘿 我有一个关于离子导航的问题 我的应用程序的主要导航位于页脚中 但我想在标题中添加一个信息选项卡 我也希望此选项卡有它自己的视图 所以我将其设置如下所示
  • 更改所有页面的背景颜色 WP7

    有没有办法改变所有页面的背景颜色 或者我只需要改变LayoutRoot每页上的颜色 您可以做的是创建一个应用背景颜色的样式 您仍然需要将该样式应用到每个页面 但之后如果您需要进行更多更改 则只需更改样式即可 应用于页面的示例样式可以在以下位
  • 如何将 matplotlib 图保存为 .png 文件

    我有一段代码是从工作中的合作者那里获得的 这段代码生成如下图所示的图 绘图的示例图像 https i stack imgur com oJJLZ png 它通过引用另一段代码中的另一个函数来实现这一点 我不想以任何方式改变这一点 我想做的是
  • PHP 会话固定/劫持

    我正在尝试更多地了解 PHP会话固定 https www owasp org index php Session fixation以及劫持以及如何预防这些问题 我在 Chris Shiflett 的网站上阅读了以下两篇文章 会话固定 htt