javascript - 在 PHP 命令行中访问 session ?

标签 javascript php session websocket

据我了解,命令行不是 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" );

我愿意接受各种建议,例如 websocket 的替代方案。我正在为我的网站创建实时聊天。

最佳答案

第一个选择当然是 AJAX 请求。 AJAX 不存在无法快速轻松地访问 WebSockets 所具有的 session 的问题。任何足够频繁的采样率都与实时无法区分。

现在,我在 WebSocket 中实现的相当冗长的解决方案:

HTTP header 在握手期间可供 WebSocket 服务器使用,包括 cookie。在您使用的服务器中,PHP-Websockets , header 存储在 $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"
}

我们现在有了 session ID。仔细检查 session_name(),这将为您提供实际保存 session ID 的 cookie 的 key 。

我们可以序列化和反序列化存储在服务器中的 session 文件,该文件由 session_save_path() 指向......但我想作弊。

由于内置的​​ session 系统锁定了 session 文件,我们不能只是保持 session 文件打开并不断监视更改,也不能自己长时间锁定文件。

如果我们能够像使用 $_SESSION 一样使用 __get()__set() 魔术方法,那就太理想了 超全局方法(例如 $myUser->_session['key'] = 'value';),但 PHP 不允许将这些方法视为数组。相反,我们必须设置一个更普通的命名方法。

<?php
class MyUser extends WebSocketUser {
    public $session_id; // gets set somewhere. Good place is probably is your implementation of the `connected($user)` abstract method.

    public getSession($key) {
        session_id($this->session_id);
        session_start();
        $val = $_SESSION[$key];
        session_write_close(); // very important!
        return $val;
    }

    public setSession($key, $value) {
        session_id($this->session_id);
        session_start();
        $_SESSION[$key] = value;
        session_write_close(); // still very important!
    }
}

(注意:我还将我的 feature request 指向这个问题,以将我最终实现的 cookie 解析和 session 处理作为基础,这样我就可以在工作时记住今晚的研究。)

关于javascript - 在 PHP 命令行中访问 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31528104/

相关文章:

javascript - 如何在javascript中替换两个指定字符之间的字符串

php - 添加介绍图像 fadeIn wordpress

PHP嵌套foreach

php - 将 $_SESSION[] 数据制作成 php 变量,但它仍然无法在 mysql 查询中工作

node.js - 中间件和 NodeJS 错误

JavaScript 原型(prototype)继承不起作用

javascript - Vue.js 内联模板不显示数据

php - TCPDF:PHPMailer 附件为空

php - 安全且优于普通登录并检查用户是否为登录脚本。 PHP/MYSQL代码,网页开发

javascript - 如何从 JavaScript 中的 Kendo Grid 对象获取隐藏列字段名称