我正在运行 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 {
...
}
那么,有什么建议吗?
您的代码组织良好,可以使用 chromedp 处理键盘和鼠标事件。由于您正在处理来自外部源的 JSON 格式的用户输入事件,因此安全检查对于防止意外或恶意输入干扰 Chrome 的行为至关重要。以下是一些安全检查和改进的建议:
例如:
DispatchKeyEventParams:验证类型、修饰符、键等字段,以确保它们在预期的范围或类型内。 DispatchMouseEventParams:检查 X、Y 坐标和事件类型,以确保它们符合您的应用程序的要求。 使用 JSON 模式验证器可以帮助自动化此操作,但手动检查关键字段也是可行的。
限制事件发生率 如果输入源可能会向您的应用程序发送大量事件,则可能会淹没您的应用程序或 Chrome。考虑对这些事件进行速率限制或去抖,以减少过多、快速的事件。实施一种机制来限制每秒或每个客户端会话处理的事件数量。
限制允许的组合键 对于键盘事件,您可能希望限制某些可能有害的组合键或序列。例如:
禁止使用系统按键:防止触发 F12、Alt+Tab 或 Ctrl+Alt+Delete 等可能会干扰 Chrome 操作或主机系统的按键。 阻止具有副作用的按键:防止可能更改 Chrome 状态的操作,例如 Ctrl+W(关闭选项卡)、Ctrl+N(新窗口)等,除非您的用例明确需要这些操作。 您可以通过验证 keyevt.Key、keyevt.Modifiers 和 keyevt.Type 字段来过滤键,并拒绝可能引起问题的组合。
鼠标事件的坐标边界检查 对于 DispatchMouseEventParams,请确保 X 和 Y 值位于预期视口的范围内。大的值,无论是意外还是恶意,都可能导致不稳定的行为,甚至意外的滚动。
限制键盘和鼠标的事件类型 确保仅允许支持的事件类型通过。例如:
对于 keyevt.Type,仅允许合法类型,如“keyDown”、“keyUp”或“char”。 对于 ptrevt.Type,仅允许“mousePressed”、“mouseReleased”、“mouseMoved”等类型。 拒绝不受支持或异常的事件类型可以减少潜在的滥用。
示例:在客户端连接时实施 API 令牌或其他身份检查。