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

时间:2013-04-17 16:15:37

标签: javascript c++ browser npapi firebreath

我正在开发一个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()以便伪造响应。 (所以这个解决方案:Detect if function is native to browser并不是真的安全)

因此我想问你,你知道任何跨平台(OSX,Linux和Windows)的方式来显示一个不能以任何方式被黑客攻击的确认对话框吗? OR 是否可以通过FireBreath直接访问window.confirm的原生函数?

我知道QT或wxWidgets是一种选择,但这确实是我最后的选择。

1 个答案:

答案 0 :(得分:0)

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

(您可能需要在单独的线程上执行此操作,因为阻止主线程是大多数浏览器中插件终止的理由)

我能给你的一个例子最接近的是我用来做文件/文件夹打开对话框的代码,which you can find in a gist

相关问题