我正在开发一个 FireBreath NPAPI 插件,在某些情况下它必须搜索用户的文件系统。
为了通知用户并避免恶意使用插件,我想向用户显示一个确认对话框,允许他接受或拒绝任务。
到目前为止,我设法显示了经典的 Javascriptwindow.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()
以伪造响应。(所以这个解决方案:Detect if function is native to browser is not really safe)
因此我想问你,你知道任何跨平台(OSX、Linux 和 Windows)的方式来显示一个不能以任何方式被黑客入侵的确认对话框吗?或者是否可以通过 FireBreath 直接访问的本机功能window.confirm
?
我知道 QT 或 wxWidgets 是一种选择,但这确实是我最后的选择。