0

場合によってはユーザーのファイルシステムを検索する必要がある 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.toStringand/orを過負荷にする可能性があります。Function.prototype.toString()(したがって、このソリューション: Detect if function is native to browserは実際には安全ではありません)

したがって、私はあなたに尋ねたかったのですが、ハッキングできないクロスプラットフォーム (OSX、Linux、および Windows) の確認ダイアログを表示する方法を知っていますか? またはFireBreath 経由で のネイティブ機能に直接アクセスすることは可能window.confirmですか?

QT または wxWidgets がオプションであることは知っていますが、それは本当に最後の手段です。

4

1 に答える 1