【问题标题】:Work with PHP sessions (stored in mySql) in Node.js在 Node.js 中使用 PHP 会话(存储在 mySql 中)
【发布时间】:2015-05-09 20:55:04
【问题描述】:

我正在尝试在 node.js 中使用活动会话(从 php 开始)

对于 PHP,我将会话存储在 mysql 中(通过使用 session_set_save_handler,如 http://phpsecurity.org/code/ch08-2 中所述)。适用于 PHP。

现在计划:

1) 来自 php 应用程序的客户端“执行”node.js 与 GET 中客户端的 PHPSESSID cookie 的链接:

http://192.168.0.222:53077/?phpsession=02isg9kv8fbveqhmt1htcj6cc7

2) 在 node.js 服务器端获取 PHPSESSID,在 mysql 会话表中查找它的值

3) 如果 mysql 中存在 PHPSESSID 值 - 读取存储在 mysql(会话表)中的用户 id、name 和其他用户数据

问题是 - 方法对吗?我认为我错了,至少从第 2 步开始。在 Node.js 中使用存储在 mysql 中的会话从 php 开始的正确工作方式是什么?

请尽量不要建议我将会话存储在 memcached 或 redis 中,我选择了 mysql。

【问题讨论】:

  • 通过 URL 传递会话令牌会使您的用户特别容易受到会话劫持(将显示在服务器日志中,可能显示在存储在浏览器中的 url 上等)。我会在请求中添加一个 HTTP 标头。
  • 我预料到了。本来想问的,但你已经回答了。你建议我不要使用 GET 吗?或者 - 使用 GET,但发送 HTTP 标头而不是 cookie id?你能写一个小样本吗?无论如何,谢谢。

标签: php mysql node.js session


【解决方案1】:

由于您自己使用 session_set_save_handler 处理会话,因此您可以选择以任何您想要的方式序列化数据。我会建议 json_encode() 与 nodejs 兼容。

PHP 将已序列化的数据作为字符串提供给您的保存处理程序,因此您需要 unserialize() 它并使用 json_encode 重新序列化。在返回 PHP 之前,将会话 blob 读取调整为 json_decode() 和 serialize()。

您的步骤 1、2 和 3 似乎是正确的。更详细的问题可以提供更好的答案。

我建议确保您的 SQL 表有几列用于会话存储。

  • “created_on”整数时间戳
  • “updated_on”整数时间戳
  • “long_term”小整数,如果用户勾选“记住我”什么的 类似,这应该跳过正常的会话垃圾收集
  • “ip_addr”可用于提醒用户注意潜在的会话劫持。
  • "agent" 可以是用户代理的 md5 或 sha1 总和,以检测来自的访问 不同的设备/浏览器

【讨论】:

  • 感谢您的回答。关于 json 的问题:你的意思是这样的吗: 1. 在 php 中:json_encode() 用于以 json 格式存储会话数据; 2. 在 node.js 中:json_decode() 用于读取 json 格式的会话数据。我无法得到一件主要的事情:我是否需要将节点的会话技术与存储在 mysql(会话表)中的数据绑定?或者我只是读取存储在 mysql 中的数据并在 node.js 中使用它?我是否需要在 node.js 中使用类似“goran”的东西(在link 中找到)?
  • 您可能会过度思考整个问题。当您需要从 Node 中的会话中访问数据时,请确保 Node 可以访问从 PHP 生成的会话 ID,并读取该表。唯一的问题是,PHP的默认序列化可能无法被Node解析,所以在写入DB时使用PHP中的json_encode/decode。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 2012-06-09
  • 2015-10-09
  • 1970-01-01
  • 2023-03-25
  • 2011-08-09
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多