Я разрабатываю плагин 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 — вариант, но это действительно мое последнее средство.
Нет, в значительной степени не будет никакого способа безопасно сделать это кроссплатформенным способом. Вероятно, я бы открыл диалоговое окно подтверждения системы на каждой платформе.
(вам, вероятно, потребуется сделать это в отдельном потоке, поскольку блокировка основного потока является основанием для завершения плагина в большинстве браузеров)
Наиболее близкий пример к примеру, который я могу дать, — это код, который я использую для открытия диалога открытия файла / папки, который вы можете найти в сущности.
Других решений пока нет …