通过GET在脚本中分配sid(会话ID)是危险的吗?

时间:2016-12-14 16:05:15

标签: php session session-cookies

我看到我可以更改浏览器并继续保存会话中存储的信息,如果我将其分配给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

1 个答案:

答案 0 :(得分:0)

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

  

session.use_strict_mode boolean

     

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的安全程度,这可能不切实际或非常实用。