PHP在另一个用户会话中注入

时间:2009-09-08 14:21:17

标签: php

由于每个用户都有一个唯一的PHPSESSID,两个用户是否可以,比如a使用服务器上运行的标准PHP将信息注入b的SESSION数据。

注意,我没有将此用于任何错误的目的。尝试使用它进行聊天,无需访问数据库。

感谢您的时间。

6 个答案:

答案 0 :(得分:6)

我假设你想通过发送一条消息进入B的会话,以某种方式与B聊天。

首先,A需要学习B的会话ID,可能是从列表中选择他们的名字。你几乎肯定想要加密这些会话ID,否则你已经创建了一个很好的安全漏洞!

因此,A将数据发布到包含目标会话ID和服务器的服务器。以下是我们如何临时切换会话ID以将该数据写入目标会话:

//get data from form - I'll leave the encryption of the target
//session id up to you!
$target_session_id=decryptSessionId($_POST['target']);
$message=strip_tags($_POST['message']);

//remember our "real" session id and close the session
$original_session_id=session_id();
session_write_close();

//open the target session
session_id($target_session_id);
session_start();

//add message to target session
$_SESSION['chat'][]=$message;

//close target session
session_write_close();


//reopen the "real" session
session_id($original_session_id);
session_start();

答案 1 :(得分:2)

答案 2 :(得分:1)

会话是一个简单的事情,可以轻松地重新实现,以实现您的愿望。看看我前段时间写的这个简单的例子:http://pastebin.com/f3ca0ae8d

用法:

  • new mySession();session_start();
  • 相同
  • $_MYSESSION$_SESSION
  • 相同
  • delete mySession();执行与session_write_close();相同的操作,除非您想在脚本结束前释放会话,否则无需使用。

您可以根据具体目的进行一些调整,例如自己定义会话ID,以便在不同用户之间共享。由于$ _MYSESSION在用户中很常见,您还可以使用常规PHP会话来在$ _SESSION中存储用户特定信息。

[编辑]

http://pastebin.com/f3c31737e

例子:输入频道$ _SESSION ['channelid']并打印所有未读行。


session_start();
new mySession($_SESSION['channelid']);

while (count($_MYSESSION['chat']) > 100) unset($_MYSESSION['chat'][key($_MYSESSION['chat'])]);

while ($line = $_MYSESSION['chat'][$_SESSION['lastread']++])
        echo "$line
";

例如:与频道对话。


session_start();
new mySession($_SESSION['channelid']);

$_MYSESSION['chat'][] = $_SESSION['myname'] . ' says, "' . htmlspecialchars($_POST['message']) . '"';

等...

答案 3 :(得分:1)

为什么不直接指向并使用文本文件,而不是放弃通过会话系统进行间接文件处理的内容?

它不易受到攻击,也不那么易受攻击,因为PHP的未来版本可能出于安全原因决定阻止这种会话切换(完全假设,但这很有意义)。

答案 4 :(得分:0)

我不能肯定地说,但由于会话数据默认存储在文件中,如果您的应用知道其他用户的会话ID,您可以在会话文件中替换标准会话函数所写的会话文件数据。下次其他用户访问脚本时,将加载更改的会话数据。

但如果您只是在内置会话处理之上执行此操作,那么您将面临各种竞争条件和冲突的风险。您可能希望用自己的会话处理函数替换会话处理函数,以便处理所有这些问题。这些问题可能比它们表面上看起来要复杂得多。

有关自定义会话处理程序的信息,请参阅: http://www.php.net/manual/en/session.customhandler.php

答案 5 :(得分:0)

PHP的默认会话处理程序仅使用会话ID来标识会话。这使得可以使用来自另一个用户的会话ID,从而使用相同的会话(Session Hijacking)。另一个攻击是准备会话并让受害者使用该会话,以便受害者和攻击者再次使用相同的会话(Session fixation)。

此类攻击的基础是您只需知道会话ID即可使用与其关联的会话。预防技术是使用比会话ID更多的识别信息。有人建议使用IP地址(但可能在会话期间更改)或用户代理标识符。另一种技术是通过仅允许cookie和HTTPS来隐藏会话ID。

但也要注意共享托管。有些人可能会使用公共池来存放所有偶像的所有会话数据文件。