You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
You can use certain methods to let the plugin provide data like other players' inventories and coordinates. #338
In the past when this happened, usually there is a plugin conflict with another plugin or a configuration error. As under normal circumstances that plugin blocks input of tags.
Can you show me your IC config on both the proxy and backend?
Activity
LOOHP commentedon Sep 12, 2026
In the past when this happened, usually there is a plugin conflict with another plugin or a configuration error. As under normal circumstances that plugin blocks input of tags.
Can you show me your IC config on both the proxy and backend?
Minecraft0122 commentedon Sep 12, 2026
Okay, this is the configuration.
If I remember correctly, I just translated it through AI and didn't really change anything.
bungeeconfig.yml
config.yml
Minecraft0122 commentedon Oct 6, 2026
查到具体位置了。问题的核心是:InteractiveChat 用消息正文中的
<chat=UUID:…>标签确定“发言者”,但保护它的输入过滤依赖事件顺序;代理端确实存在会破坏这个过滤链路的代码缺陷。 不能只归因于配置或其他聊天插件冲突。我检查的是当前
master的提交55528e1bacf497426fd299d358805d578ae78350,并对照了作者为 #323 发布的 2026 年 4 月 17 日改动。以下区分已确认的源码缺陷和仍需复现的部分。1. 最根本的位置:后端相信正文里的 UUID
在
ProcessAccurateSender.java中,process()和find()用正则匹配<chat=UUID:…:>,然后直接执行:这段代码只负责解析标签,没有验证标签是否由 IC 生成,也没有验证该 UUID 是否属于真实发言者。源码,第 35–74 行
随后,
OutMessagePacket.java在没有已确定发言者时,用标签中的 UUID 获取ICPlayer,赋给sender,再把这个sender交给背包、末影箱和自定义占位符模块。身份选择,第 156–185 行、数据解析,第 242–249 行因此,只要伪造标签能进入这条处理路径,插件就可能把受害者当作分享数据的人。
权限检查也不能补救身份错误:背包模块检查的是已经选出的
player.getUniqueId()是否有分享背包权限,然后读取该玩家的背包。它检查的是被冒充玩家的权限,不是实际输入者是否有权读取对方数据。背包模块,第 77–85 行2. 当前仍存在的明确错误:收尾监听器实际上最先执行
InteractiveChatVelocity.java的两个收尾方法:但 Velocity 的规则是:优先级数值越大,越早执行。
Short.MAX_VALUE会让它们在默认优先级为0的过滤处理之前运行。IC 监听器代码、Velocity 官方规则这直接破坏了预期流程:
同步发生在
completeHandleChat()中,它调用forwardSignedChatEventChange()。同步代码,第 848–859 行与此同时,后端
ChatEvents.checkChat()和checkCommand()只在bungeecordMode == false时删除输入标签。代理模式开启时,它依赖代理完成过滤。后端过滤条件,第 183–198 行这构成了一条明确的风险链:代理过滤结果未正确同步,后端又跳过过滤,最后正文标签被当成身份依据。是否在具体客户端和聊天插件组合中完成绕过,还需要运行复现。
3. 与 #323 频道命令更直接相关:转发命令可能被误当成“禁止执行”
代理的
handleCommandExecute()把:传给
handleChat(),而后者首先执行:问题在于,Velocity 的
forwardToServer()返回的是isAllowed() == false、isForwardToServer() == true。这表示“转交后端执行”,并不表示整个命令被禁止。IC 入口及提前返回、Velocity 命令结果定义如果其他监听器先把频道命令设为转发后端,IC 就会直接跳过标签过滤。 这与 #323 中“普通聊天能拦截,但频道发送命令可绕过”的现象相符。不过,尚未取得报告者实际使用的 ChatControl/VelocityControl 版本来确认其事件顺序,因此这是源码确认的条件性绕过路径,不能说已经完整复现了该报告。
4. 旧版本还有一个已经修改的缺陷
4 月 17 日之前的
handleChat()虽然生成了过滤后的newMessage,但变量message仍然保存原始输入。后续聊天分支又使用message添加身份标签,并覆盖回newMessage,导致过滤结果丢失。作者的提交
cce1dbb…已改为从过滤后的消息继续处理,修掉了这处错误;但同一次提交引入了上面提到的Short.MAX_VALUE收尾顺序错误。作者当时的修改所以,修复应优先处理 Velocity 收尾顺序、转发命令的过滤条件,以及后端标签身份的可信来源。单纯调整
ChatEventPriority或把频道命令加入解析列表,不能作为完整修复。本次是源码诊断,没有修改插件,也没有搭建服务器复现。可以确认上述代码错误存在;#323 的具体插件组合是否正好通过其中哪条路径绕过,仍需用报告者版本做针对性验证。
查到具体位置了。**问题的核心是:InteractiveChat 用消息正文中的 `` 标签确定“发言者”,但保护它的输入过滤依赖事件顺序;代理端确实存在会破坏这个过滤链路的代码缺陷。** 不能只归因于配置或其他聊天插件冲突。我检查的是当前
master的提交55528e1bacf497426fd299d358805d578ae78350,并对照了作者为 #323 发布的 2026 年 4 月 17 日改动。以下区分已确认的源码缺陷和仍需复现的部分。1. 最根本的位置:后端相信正文里的 UUID
在
ProcessAccurateSender.java中,process()和find()用正则匹配<chat=UUID:…:>,然后直接执行:这段代码只负责解析标签,没有验证标签是否由 IC 生成,也没有验证该 UUID 是否属于真实发言者。[源码,第 35–74 行](
InteractiveChat/common/src/main/java/com/loohp/interactivechat/modules/ProcessAccurateSender.java
Lines 35 to 74 in 55528e1
随后,
OutMessagePacket.java在没有已确定发言者时,用标签中的 UUID 获取ICPlayer,赋给sender,再把这个sender交给背包、末影箱和自定义占位符模块。[身份选择,第 156–185 行](https://github.com/LOOHP/InteractiveChat/blob/55528e1bacf497426fd299d358805d578ae78350/common/src/main/java/com/loohp/interactivechat/listeners/packet/listeners/OutMessagePacket.java#L156-L185)、[[数据解析,第 242–249 行](https://github.com/LOOHP/InteractiveChat/blob/55528e1bacf497426fd299d358805d578ae78350/common/src/main/java/com/loohp/interactivechat/listeners/packet/listeners/OutMessagePacket.java#L242-L249)](https://github.com/LOOHP/InteractiveChat/blob/55528e1bacf497426fd299d358805d578ae78350/common/src/main/java/com/loohp/interactivechat/listeners/packet/listeners/OutMessagePacket.java#L242-L249)因此,只要伪造标签能进入这条处理路径,插件就可能把受害者当作分享数据的人。
权限检查也不能补救身份错误:背包模块检查的是已经选出的
player.getUniqueId()是否有分享背包权限,然后读取该玩家的背包。它检查的是被冒充玩家的权限,不是实际输入者是否有权读取对方数据。[背包模块,第 77–85 行](InteractiveChat/common/src/main/java/com/loohp/interactivechat/modules/InventoryDisplay.java
Lines 77 to 85 in 55528e1
2. 当前仍存在的明确错误:收尾监听器实际上最先执行
InteractiveChatVelocity.java的两个收尾方法:但 Velocity 的规则是:优先级数值越大,越早执行。
Short.MAX_VALUE会让它们在默认优先级为0的过滤处理之前运行。[IC 监听器代码](https://github.com/LOOHP/InteractiveChat/blob/55528e1bacf497426fd299d358805d578ae78350/common/src/main/java/com/loohp/interactivechat/proxy/velocity/InteractiveChatVelocity.java#L653-L730)、[[Velocity 官方规则](https://github.com/PaperMC/Velocity/blob/dev/3.0.0/api/src/main/java/com/velocitypowered/api/event/Subscribe.java)](https://github.com/PaperMC/Velocity/blob/dev/3.0.0/api/src/main/java/com/velocitypowered/api/event/Subscribe.java)这直接破坏了预期流程:
同步发生在
completeHandleChat()中,它调用forwardSignedChatEventChange()。[同步代码,第 848–859 行](InteractiveChat/common/src/main/java/com/loohp/interactivechat/proxy/velocity/InteractiveChatVelocity.java
Lines 848 to 859 in 55528e1
与此同时,后端
ChatEvents.checkChat()和checkCommand()只在bungeecordMode == false时删除输入标签。代理模式开启时,它依赖代理完成过滤。[后端过滤条件,第 183–198 行](InteractiveChat/common/src/main/java/com/loohp/interactivechat/listeners/ChatEvents.java
Lines 183 to 198 in 55528e1
这构成了一条明确的风险链:代理过滤结果未正确同步,后端又跳过过滤,最后正文标签被当成身份依据。是否在具体客户端和聊天插件组合中完成绕过,还需要运行复现。
3. 与 #323 频道命令更直接相关:转发命令可能被误当成“禁止执行”
代理的
handleCommandExecute()把:传给
handleChat(),而后者首先执行:问题在于,Velocity 的
forwardToServer()返回的是isAllowed() == false、isForwardToServer() == true。这表示“转交后端执行”,并不表示整个命令被禁止。[IC 入口及提前返回](https://github.com/LOOHP/InteractiveChat/blob/55528e1bacf497426fd299d358805d578ae78350/common/src/main/java/com/loohp/interactivechat/proxy/velocity/InteractiveChatVelocity.java#L713-L744)、[[Velocity 命令结果定义](https://github.com/PaperMC/Velocity/blob/dev/3.0.0/api/src/main/java/com/velocitypowered/api/event/command/CommandExecuteEvent.java#L230-L248)](https://github.com/PaperMC/Velocity/blob/dev/3.0.0/api/src/main/java/com/velocitypowered/api/event/command/CommandExecuteEvent.java#L230-L248)如果其他监听器先把频道命令设为转发后端,IC 就会直接跳过标签过滤。 这与 #323 中“普通聊天能拦截,但频道发送命令可绕过”的现象相符。不过,尚未取得报告者实际使用的 ChatControl/VelocityControl 版本来确认其事件顺序,因此这是源码确认的条件性绕过路径,不能说已经完整复现了该报告。
4. 旧版本还有一个已经修改的缺陷
4 月 17 日之前的
handleChat()虽然生成了过滤后的newMessage,但变量message仍然保存原始输入。后续聊天分支又使用message添加身份标签,并覆盖回newMessage,导致过滤结果丢失。作者的提交
cce1dbb…已改为从过滤后的消息继续处理,修掉了这处错误;但同一次提交引入了上面提到的Short.MAX_VALUE收尾顺序错误。[作者当时的修改](cce1dbb)所以,修复应优先处理 Velocity 收尾顺序、转发命令的过滤条件,以及后端标签身份的可信来源。单纯调整
ChatEventPriority或把频道命令加入解析列表,不能作为完整修复。本次是源码诊断,没有修改插件,也没有搭建服务器复现。可以确认上述代码错误存在;#323 的具体插件组合是否正好通过其中哪条路径绕过,仍需用报告者版本做针对性验证。
Minecraft0122 commentedon Oct 6, 2026
I use GPT to find this question. Answer like above
LOOHP commentedon Oct 6, 2026
Looking at your backend IC config, it seems like you haven't enabled
Bungeecord: false. Have you tried that first?Minecraft0122 commentedon Oct 6, 2026
It seems like it didn't start, I'll give it a try.
Minecraft0122 commentedon Oct 6, 2026
I tried it, and even when it starts, the problem still exists.
LOOHP commentedon Oct 6, 2026
What exactly did you type into the chat to trigger the issue?
Minecraft0122 commentedon Oct 6, 2026
<chat=8030b484-93cb-3e44-a5c9-97b5258ad3b1:[inv]/[ender]/[pos]/[bal]/[ping]>
LOOHP commentedon Oct 6, 2026
Can you try whether the issue occurs if you type these two?
Notice the extra
:near the end.Minecraft0122 commentedon Oct 11, 2026
There will be.