我知道命令行不是Web服务器,因此您无法访问$_SESSION
。但我不知道还能做什么。
我一直在按照本教程使用websockets创建聊天:http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html
我的问题是,我不知道如何安全地获取邮件发件人的用户名。我可以将它包含在消息发送功能中,但由于它是在Javascript中,所以每个人都可以将其用户名编辑为别人。
我如何安全地获取用户的用户名,即$_SESSION['username']
?
var Server;
Server = new FancyWebSocket('ws://0.0.0.0:9000');
send( "test" );
我愿意接受各种建议,比如websockets的替代品。我正在为我的网站创建一个实时聊天。
答案 0 :(得分:1)
第一种选择当然是AJAX请求。 AJAX没有能够快速轻松地访问WebSockets所具有的会话的问题。任何足够频繁的采样率都与实时无法区分。
现在,我在WebSockets中实现了相当冗长的解决方案:
握手期间WebSocket服务器可以使用HTTP标头,包括cookie。在您正在使用的服务器PHP-Websockets中,标头存储在$headers
属性中。
例如:
var_dump($user->headers);
array(14) {
["get"]=>
string(8) "/echobot"
["host"]=>
string(14) "127.0.0.1:9000"
...snip...
["cookie"]=>
string(100) "PHPSESSID=jan9uknpc06mk4ddghph4870t1; MyCookie=My+Value%21%40%23%24%25; MyNonhttponlyCookie=My+Value"
}
这些cookie是从
生成的session_start();
$_SESSION['Hi!'] = array('Hello!', 'where' => 'world!');
setcookie('MyCookie', 'My Value;!@#$%', 0, '/', '127.0.0.1', false, true);
setcookie('MyNonhttponlyCookie', 'My Value', 0, '/', '127.0.0.1', false, false);
因此,$user->headers['cookie']
的值是分号和空格(;
)分隔的键值对集合,其中值是URL编码的,并且用等号与其键分隔。 (如果你在cookie名称中加上保留字符,PHP会抱怨。因此cookie密钥不能包含任何url编码值。)
提取这些内容的快速方法如下
$cookies = array();
$cookiesParts = explode('; ', $user->headers['cookie']);
foreach ($cookiesParts as $cookieParts) {
$interimCookie = explode('=', $cookieParts);
$cookies[$interimCookie[0]] = urldecode($interimCookie[1]);
}
var_dump($cookies);
array(3) {
["PHPSESSID"]=>
string(26) "jan9uknpc06mk4ddghph4870t1"
["MyCookie"]=>
string(14) "My Value;!@#$%"
["MyNonhttponlyCookie"]=>
string(8) "My Value"
}
我们现在有会话ID。仔细检查session_name()
,它将为您提供实际保存会话ID的cookie的密钥。
我们可以序列化和反序列化存储在服务器中的会话文件,session_save_path()
指向...但我想作弊。
由于内置会话系统会锁定会话文件,因此我们无法保持会话文件处于打开状态并不断监视更改,也无法长时间自行锁定文件。
如果我们可以使用__get()
和__set()
魔术方法,就像我们使用$_SESSION
超全球一样(例如{{1}但是,PHP不允许将这些方法视为数组。相反,我们必须设置一个更普通的命名方法。
$myUser->_session['key'] = 'value';
(注意:我也指出了我的feature request这个问题,以此为基础,最终实现了cookie解析和会话处理,这样我今晚就能记住我的研究工作。)< / p>