FireBreath:如何安全地向用户显示确认对话框

FireBreath: How to securely display a confirmation dialog to the user?

本文关键字:用户 显示 对话框 确认 安全 何安全 FireBreath      更新时间:2023-10-16

我正在开发一个FireBreath NPAPI插件,在某些情况下,它必须搜索用户的文件系统。

通知用户并避免恶意使用插件,我想向用户显示一个确认对话框,这将允许他接受或拒绝任务。

到目前为止,我成功地显示了经典的Javascript window.confirm对话框,但它远非安全:

bool MyPlugin::confirm( std::string msg ) {
    FB::DOM::WindowPtr window = m_host->getDOMWindow();
    FB::JSObjectPtr obj = window->getProperty<FB::JSObjectPtr>("window");
    return obj->Invoke("confirm", FB::variant_list_of( msg )).convert_cast<bool>();
}

恶意用户可以重载window.confirm函数以始终返回true。我想到的一个解决方案是检查该函数是否确实是浏览器原生的:

// Make sure the function is valid native function and not a hack 
FB::variant f = obj->GetProperty("confirm");
FB::JSObjectPtr fPtr = f.convert_cast<FB::JSObjectPtr>();
std::string fType = fPtr->Invoke("toString", FB::variant_list_of( msg )).convert_cast<std::string>();
// Look for [native code] in fType

但是恶意用户可以再次重载window.confirm.toString和/或Function.prototype.toString()以伪造响应。(所以这个解决方案:检测如果函数是本地的浏览器是不安全的)

所以我想问你,你知道任何跨平台(OSX, Linux和Windows)的方式来显示确认对话框,不能以任何方式被黑客入侵吗?是否可以通过FireBreath直接访问window.confirm的本机功能?

我知道QT或wxWidgets是一个选择,但这真的是我最后的手段。

不,几乎没有任何方法可以安全地以跨平台的方式做到这一点。我可能会在每个平台上弹出一个系统确认对话框。

(你可能需要在一个单独的线程上做,因为阻塞主线程在大多数浏览器中是插件终止的理由)

我能给你的最接近的例子是我用来打开文件/文件夹对话框的代码,你可以在gist中找到。