使用 Chromedp 进行事件注入的安全良好实践

问题描述 投票:0回答:1

我正在运行 Chrome 并在服务器应用程序中使用 Chromedp 驱动它。我需要接收键盘和鼠标事件的客户端请求并在 chrome 上触发这些事件。请求采用 json 格式,已采用 input.DispatchMouseEventParams 和 input.DispatchKeyEventParams 格式。所以,我只是解码 json 并调用事件调度。 它运行良好,但我担心我应该进行哪些安全检查。代码如下。

这是键盘事件处理:

                    msgType, buf, err = conn.ReadMessage()
                    if err != nil {
                        ...
                    }
                    keyevt = input.DispatchKeyEventParams{}
                    err = json.Unmarshal(buf, &keyevt)
                    if err != nil {
                        ...
                    }

                    // Security checks, if any, must go here

                    err = keyevt.Do(ctx)
                    if err != nil {
                        ...
                    }

这是指针事件处理:

                    msgType, buf, err = conn.ReadMessage()
                    if err != nil {
                        ...
                    }

                    ptrevt = input.DispatchMouseEventParams{}
                    err = json.Unmarshal(buf, &ptrevt)
                    if err != nil {
                        ...
                    }

                    // Security checks, if any, must go here

                    ptrevt.Y -= float64(htmlYOffset)
                    ptrevt.X -= float64(htmlXOffset)

                    err = ptrevt.Do(ctx)
                    if err != nil {
                        ...
                    }

那么,有什么建议吗?

go security event-handling code-injection chromedp
1个回答
0
投票

您的代码组织良好,可以使用 chromedp 处理键盘和鼠标事件。由于您正在处理来自外部源的 JSON 格式的用户输入事件,因此安全检查对于防止意外或恶意输入干扰 Chrome 的行为至关重要。以下是一些安全检查和改进的建议:

  1. 验证 JSON 架构 确保 JSON 输入严格遵循 DispatchKeyEventParams 或 DispatchMouseEventParams 格式。您可能想要强制执行特定属性或限制某些值。这可以防止格式错误或意外的数据导致意外行为。

例如:

DispatchKeyEventParams:验证类型、修饰符、键等字段,以确保它们在预期的范围或类型内。 DispatchMouseEventParams:检查 X、Y 坐标和事件类型,以确保它们符合您的应用程序的要求。 使用 JSON 模式验证器可以帮助自动化此操作,但手动检查关键字段也是可行的。

  1. 限制事件发生率 如果输入源可能会向您的应用程序发送大量事件,则可能会淹没您的应用程序或 Chrome。考虑对这些事件进行速率限制或去抖,以减少过多、快速的事件。实施一种机制来限制每秒或每个客户端会话处理的事件数量。

  2. 限制允许的组合键 对于键盘事件,您可能希望限制某些可能有害的组合键或序列。例如:

禁止使用系统按键:防止触发 F12、Alt+Tab 或 Ctrl+Alt+Delete 等可能会干扰 Chrome 操作或主机系统的按键。 阻止具有副作用的按键:防止可能更改 Chrome 状态的操作,例如 Ctrl+W(关闭选项卡)、Ctrl+N(新窗口)等,除非您的用例明确需要这些操作。 您可以通过验证 keyevt.Key、keyevt.Modifiers 和 keyevt.Type 字段来过滤键,并拒绝可能引起问题的组合。

  1. 鼠标事件的坐标边界检查 对于 DispatchMouseEventParams,请确保 X 和 Y 值位于预期视口的范围内。大的值,无论是意外还是恶意,都可能导致不稳定的行为,甚至意外的滚动。

  2. 限制键盘和鼠标的事件类型 确保仅允许支持的事件类型通过。例如:

对于 keyevt.Type,仅允许合法类型,如“keyDown”、“keyUp”或“char”。 对于 ptrevt.Type,仅允许“mousePressed”、“mouseReleased”、“mouseMoved”等类型。 拒绝不受支持或异常的事件类型可以减少潜在的滥用。

  1. 对客户端进行身份验证和授权 如果您的服务器暴露给多个客户端,请使用身份验证机制来验证它们的身份。您还可以添加授权层以确保仅允许某些客户端发送特定事件。

示例:在客户端连接时实施 API 令牌或其他身份检查。

  1. 记录可疑事件 实施日志记录以记录异常或可疑的输入模式。例如,快速连续事件、极端坐标值或受限组合键可能会触发警告。这些日志可用于审核客户端行为并检测潜在的滥用行为。
© www.soinside.com 2019 - 2024. All rights reserved.