【问题标题】:Is it dangerous to assign a sid (session id) in a script by GET?通过 GET 在脚本中分配 sid(会话 id)是否危险?
【发布时间】:2016-12-15 00:18:10
【问题描述】:

我已经看到,如果我将其分配给session_id(sid),我可以更改浏览器并继续保留存储在会话中的信息。

我已经准备了以下脚本,它可以正常工作以保持我想要的 sid 会话。

<?php
    echo(session_id());
    if ((isset($_GET['sid'])) && ($_GET['sid'] != session_id())) {
        session_destroy();
        session_id($_GET['sid']);
        session_start();
    }
    echo('<br/>' . session_id());
?>

<pre><?= print_r($_SESSION); ?></pre>
<pre><?= print_r($_COOKIE); ?></pre>

可能的问题和解决方案:

- 问题 01:$_GET['sid'] 中使用的任何字符串最终都会生成会话,因此会生成 C:/PHPSSID/sess_xxxxx 中的文件。有人可以生成一个循环并用内容填充服务器。

解决方案: 是否可以检查 sid 是否存在? 如果会话存在,则使用它,否则什么也不做。 但是我还没有找到任何类似于 session_id_exists 的函数。 我认为唯一的可能性是手动检查文件是否存在。还有其他解决方案吗?

- 问题02: 除了上一个问题。是否还有更多安全漏洞? 某人很容易从另一个用户生成现有的 sid 吗?我认为它会生成 26 位数字。

文档 http://php.net/manual/en/function.session-id.php

【问题讨论】:

  • 解决方案php.net/manual/en/… ?
  • 这似乎一点也不安全。你想解决哪个问题?
  • 好吧,如果您的网站不是 https,如果您可以读取用户的引荐来源网址(即:通过在您的网站上发布攻击者控制的图像),您可以劫持会话

标签: php session session-cookies


【解决方案1】:

您可以使用the session.use_strict_mode setting 强制服务器仅接受现有会话标识符。来自文档:

session.use_strict_mode布尔值

session.use_strict_mode 指定模块是否将使用严格的会话 id 模式。如果启用此模式,则模块不接受未初始化的会话 ID。如果从浏览器发送未初始化的会话 ID,则将新的会话 ID 发送到浏览器。通过使用严格模式的会话采用来保护应用程序免受会话固定。默认为0(禁用)。

注意:启用session.use_strict_mode 是常规会话安全所必需的。建议所有站点启用此功能。有关详细信息,请参阅session_create_id() 示例代码。

也就是说,这有很多问题。例如,您对间谍/中间人攻击等问题敞开大门。作为explained by the Open Web Application Security Project

在 cookie、URL 或隐藏变量中传输会话 id 的最佳方式是什么?

在 URL 中传输会话 ID 可能会导致多种风险。肩冲浪者可以看到会话ID;如果 URL 被缓存在客户端系统上,会话 ID 也将被存储;会话 ID 将存储在其他站点的引荐来源日志中。隐藏变量并不总是实用的,因为每个请求都可能不是 POST。 Cookie 是最安全的方法,因为 Cookie 不会被缓存,在 W3C 或引荐来源日志中不可见,而且大多数用户都接受 Cookie。

如果您不对人员进行限速或使用 WAF(Web 应用程序防火墙),理论上攻击者可以暴力破解 ID,直到攻击到真正的 ID,甚至可能是管理员。根据您生成 ID 的安全程度,这可能不切实际或非常实用。

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2011-05-03
    • 2012-08-30
    • 2016-01-28
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多