我看到我可以更改浏览器并继续保存会话中存储的信息,如果我将其分配给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位数。
答案 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的安全程度,这可能不切实际或非常实用。