LLOneBot / LLOneBot

使你的 NTQQ 支持 OneBot 11 和 Satori 协议进行机器人开发
https://llonebot.github.io
Other
1.99k stars 158 forks source link

preload.ts sendSendMsgResult 安全问题 #27

Closed PurpleNoon closed 8 months ago

PurpleNoon commented 8 months ago

如图所示,preload.tssendSendMsgResult 可被渲染端调用执行来发送任意的消息 image

安全提示来源:electron 文档进程间通信中提到的安全警告 2. 通过预加载脚本暴露 ipcRenderer.send image

或许可以采用以下这种方式来规避这个问题?(只是个人建议) image 图中红框部分代码: MessageGroup.ts

const msg = await sendIPCMsgAsync<MessageElement, Data>(
    CHANNEL_HANDLE_SINGLE_MESSAGE,
    CHANNEL_BACK_SINGLE_MESSAGE,
    oriMessage
)

IPCSend.ts

export interface SendIPCMsgSession<T> {
    id: string
    data: T
}

export function sendIPCMsgAsync<T, V>(
    channelTo: string,
    channelBack: string,
    data: T
) {
    return new Promise<V>((resolve) => {
        const onceSessionId = `${channelTo}____${uuid4()}`
        const handler = (event: any, result: SendIPCMsgSession<V>) => {
            if (result.id === onceSessionId) {
                resolve(result.data)
                ipcMain.off(channelBack, handler)
                return
            }
        }
        ipcMain.on(channelBack, handler)
        sendIPCMsg(channelTo, {
            id: onceSessionId,
            data,
        })
    })
}

preload.ts

// 感觉 sendSendMsgResult 的实现不安全,因此更改了实现方式
handleSingleMessage: (callback: (session: SendIPCMsgSession<MessageElement>) => void) => {
    ipcRenderer.on(
        CHANNEL_HANDLE_SINGLE_MESSAGE, 
        (_event, value) => callback(value)
    )
},
backSingleMessage: <T>(data: T) => {
    ipcRenderer.send(
        CHANNEL_BACK_SINGLE_MESSAGE, 
        data
    )
},
linyuchen commented 8 months ago

感谢提醒,可以提个PR,现在在逐步脱离LLAPI,以后不会在renderer进行NTQQ API的相关操作了

PurpleNoon commented 8 months ago

唔,明天我看看怎么提 pr,提到 main 还是 dev?看你最近的提交好像没提到 dev 上

linyuchen commented 8 months ago

唔,明天我看看怎么提 pr,提到 main 还是 dev?看你最近的提交好像没提到 dev 上

到dev吧,现在dev已经和main同步