由于每个用户都有一个独特的PHPSESSID,使用运行在服务器上的标准PHP,是否可能让两个用户(例如a和b)将信息注入到b的SESSION数据中。
请注意,我不会将此用于任何不良目的。我试图在没有数据库访问权限的情况下进行聊天。
感谢您的时间。
由于每个用户都有一个独特的PHPSESSID,使用运行在服务器上的标准PHP,是否可能让两个用户(例如a和b)将信息注入到b的SESSION数据中。
请注意,我不会将此用于任何不良目的。我试图在没有数据库访问权限的情况下进行聊天。
感谢您的时间。
//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();
Session是一个简单的东西,可以很容易地重新实现以满足您的需求。看一下我之前写的这个简单的例子:http://pastebin.com/f3ca0ae8d
用法:
new mySession();
执行与 session_start();
相同的操作$_MYSESSION
执行与 $_SESSION
相同的操作delete mySession();
执行与 session_write_close();
相同的操作,除非您想在脚本结束之前释放会话,否则不需要使用。您可以进行一些适应性调整,以便将其用于特定目的,例如自己定义会话ID,以便在不同用户之间共享它。由于 $_MYSESSION 将在用户之间共享,因此您还可以与常规PHP会话一起使用它,在 $_SESSION 中存储特定于用户的信息。
[编辑]
示例:输入频道 $_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<br>";
例子:与频道交流。
session_start();
new mySession($_SESSION['channelid']);
$_MYSESSION['chat'][] = $_SESSION['myname'] . ' says, "' . htmlspecialchars($_POST['message']) . '"';
等等...
与其通过会话系统进行间接文件处理,为什么不直接使用文本文件呢?这样做更不容易受到攻击,而且也不太容易出现问题,因为未来的 PHP 版本可能会出于安全原因决定防止此类会话切换(完全是假设,但有道理)。
我不能确定,但由于会话数据默认存储在文件中,如果您的应用程序知道其他用户的会话ID,则可以使用更改后的数据替换标准会话函数编写的会话文件。下次其他用户访问脚本时,将加载更改后的会话数据。
但是,如果您只是在内置会话处理之上执行此操作,则会冒着各种竞争条件和冲突的风险。您可能需要使用自己的会话处理函数来处理所有这些问题。这些问题可能比表面上看起来要复杂得多。
请参见:{{link1:http://www.php.net/manual/en/session.customhandler.php}} 了解有关自定义会话处理程序的信息