場合によってはユーザーのファイルシステムを検索する必要がある 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 を返す可能性があります。私が考えた解決策の 1 つは、関数が実際にブラウザーにネイティブであるかどうかを確認することでした。
// 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
and/orを過負荷にする可能性があります。Function.prototype.toString()
(したがって、このソリューション: Detect if function is native to browserは実際には安全ではありません)
したがって、私はあなたに尋ねたかったのですが、ハッキングできないクロスプラットフォーム (OSX、Linux、および Windows) の確認ダイアログを表示する方法を知っていますか? またはFireBreath 経由で のネイティブ機能に直接アクセスすることは可能window.confirm
ですか?
QT または wxWidgets がオプションであることは知っていますが、それは本当に最後の手段です。