Из документации: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29
"Использование addJavascriptInterface() позволяет JavaScript управлять вашим приложением.Это может быть очень полезной функцией или опасной проблемой безопасности. Когда HTML в WebView ненадежен (например, часть или весь HTML предоставляется некоторыми человек или процесс), тогда злоумышленник может ввести HTML, который выполнит ваш код и, возможно, любой код выбора злоумышленника. Не используйте addJavascriptInterface(), если весь HTML-код в этом WebView не был написан вами. Объект Java, который связан, работает в другом потоке, а не в потоке, в котором он был создан.
Предположим, у меня есть интерфейс, который показывает только пользовательское диалоговое окно или запускает загрузку на SD-карту. Будет ли это небезопасно использовать для любого URL-адреса? Как страница атаки может использовать интерфейс для запуска любого кода злоумышленника, выбрав?
Update: В соответствии с документацией:
Этот метод может использоваться, чтобы позволить JavaScript управлять хостом выражение. Это мощная функция, но также обеспечивает безопасность риск для приложений, ориентированных на уровень API JELLY_BEAN или ниже, потому что JavaScript может использовать отражение для доступа к инъецируемому объекту публичные поля. Использование этого метода в WebView, содержащем ненадежные контент может позволить злоумышленнику манипулировать хост-приложением в непреднамеренные способы выполнения Java-кода с разрешениями хоста выражение. Будьте предельно осторожны при использовании этого метода в WebView который может содержать ненадежный контент.
Есть ли пример того, как это может произойти? Это просто означает, что DOWNLOADINTERFACE.dangerousfunction
можно вызвать, если это общедоступный метод в этом классе?
Update:
Я тестировал на основании приведенного ниже примера использования, сайты могут получить доступ к системе через интерфейсы в Android 4.4, 4.1 и 3.2.
Тем не менее, я не видел эту ошибку на Android 2.2 или 2.3, взлом только вызывает силовое закрытие. Каков наилучший способ предотвратить этот взлом, кроме использования JSInterface? Могу ли я включить такие фиктивные функции, чтобы предотвратить несанкционированный вызов функций?
public Object getClass() {
//throw error, return self, or something?
}
Или переписать все, используя ajax и перехватывать вызовы? Это приведет к улучшению/снижению производительности?
Update:
Мне удалось удалить интерфейс JS и заменить функциональность, указав команды window.open(specialurl) для всех функций окна (интерфейса) и переопределив их в mustOverrideUrlLoading. Как ни странно, в некоторых случаях необходимо использовать window.open() или отображение пауз в веб-браузере (например, javascript останавливается?), А в других случаях следует использовать location.replace или просто отображать "interface://specialdata" не удалось найти сообщение.
(Я устанавливаю settings.setJavaScriptCanOpenWindowsAutomatically(true), поэтому window.open работает от JS все время.)
Кто-нибудь знает лучший способ переписать приложение с таким поведением?