javascript — 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() чтобы подделать ответ. (Так что это решение: Определить, если функция является родной для браузера не совсем безопасно)

Поэтому я хотел спросить вас, знаете ли вы какой-нибудь кроссплатформенный (OSX, Linux и Windows) способ отображения диалогового окна подтверждения, которое никак не может быть взломано? ИЛИ ЖЕ Возможно ли через FireBreath получить прямой доступ к нативной функции window.confirm?

Я знаю, что QT или wxWidgets — вариант, но это действительно мое последнее средство.

0

Решение

Нет, в значительной степени не будет никакого способа безопасно сделать это кроссплатформенным способом. Вероятно, я бы открыл диалоговое окно подтверждения системы на каждой платформе.

(вам, вероятно, потребуется сделать это в отдельном потоке, поскольку блокировка основного потока является основанием для завершения плагина в большинстве браузеров)

Наиболее близкий пример к примеру, который я могу дать, — это код, который я использую для открытия диалога открытия файла / папки, который вы можете найти в сущности.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]