如何在服务器端清理 mqtt 消息有效负载?

Posted

技术标签:

【中文标题】如何在服务器端清理 mqtt 消息有效负载?【英文标题】:how to sanitize mqtt message payload in server side? 【发布时间】:2016-11-09 12:01:27 【问题描述】:

我使用 MQTT 协议制作了一个即时通讯应用程序。 我想在负载中添加一些关于消息的额外数据,例如发送时间(服务器时间而不是客户端时间),并提供某种服务器端负载清理。

在代理的本地机器上的消息发送者和消息接收者之间添加一个具有超级用户权限的第三方客户端来完成这项工作是个好主意吗? 还是有更好的主意?

顺便说一下,我使用 EMQTT 作为消息代理。

【问题讨论】:

第 3 方客户端可以按照您的要求做的唯一方法是,如果它在处理消息时更改了主题。你想要的是一个像 mosca 这样的带有服务器端钩子的代理。不熟悉 EMQTT 不知道有没有这个能力 【参考方案1】:

从纯粹的安全角度来看,直接对等流量(没有过滤和清理)听起来像是一个危险的想法。 (至少在物联网领域我会明确反对。)

为什么?因为客户端不在您的控制范围内(即黑客可以重新设计)并注入任何流量以利用其他客户端接收端的安全漏洞。

所以在服务器端进行清理听起来是个好主意。

我会建议两个主题:一个(入站)客户端用于发布消息的主题,以及另一个(出站)客户端用于订阅消息的主题。然后,服务器端组件将从入站主题读取消息,对其进行清理并发布到出站主题。

这种解耦也使得引入 MQTT 有效负载更改变得更容易:如果您以不兼容的方式更新有效负载,则引入新的入站主题并保留旧的入站主题。这使您可以在过渡阶段为新老客户提供支持。

【讨论】:

为您解答。我是这样想的,但是性能和高可用性问题呢?以及您如何将此机制与使用或创建代理插件进行比较? 代理插件:听起来不错,但我们没有这方面的经验。高可用性:例如,如果您将“服务端组件”部署到同一台服务器,我没有看到太多额外的复杂性。性能:是的,有些退化,但恕我直言,这并不重要。如果代理插件在进程中运行,恕我直言,它可能是首选解决方案。

以上是关于如何在服务器端清理 mqtt 消息有效负载?的主要内容,如果未能解决你的问题,请参考以下文章

EMQ 的共享订阅

moquette源码分析之七--qos1和qos2消息的处理

2019-07-10-mqtt-mosquitto系列13之共享主题

2019-07-10-mqtt-mosquitto系列13之共享主题

2019-07-10-mqtt-mosquitto系列13之共享主题

MQTT系列-保留消息