我在我的项目中使用了这里描述的一段代码
http://lexandera.com/2009/01/extracting-html-from-a-webview/
我创建.apk文件,将其安装在我的设备上,它正常工作.如果我尝试使用proguard的混淆项目失败,则不会到达MyJavaScriptInterface的方法showHTML(String html).
关于那个我的proguard配置
-keep public class com.mypackage.MyClass.MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass.MyJavaScriptInterface
-keepclassmembers class * implements com.mypackage.MyClass.MyJavaScriptInterface {
<methods>;
}
Run Code Online (Sandbox Code Playgroud)
根据这个答案Android proguard Javascript Interface问题.
解决了.
正如Eric建议的那样,我改变了这样的Proguard配置文件:
-keep public class com.mypackage.MyClass$MyJavaScriptInterface
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface {
<methods>;
}
Run Code Online (Sandbox Code Playgroud)
现在我的项目完美无缺.
对于API 17+,您还需要保留@JavascriptInterface注释:
-keepattributes JavascriptInterface
Run Code Online (Sandbox Code Playgroud)
http://developer.android.com/reference/android/webkit/JavascriptInterface.html
从文档:http: //developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29
"使用addJavascriptInterface()允许JavaScript控制你的应用程序.这可能是一个非常有用的功能或危险的安全问题.当WebView中的HTML不可靠时(例如,部分或全部HTML由某人或某个人提供) ),然后攻击者可以注入执行你的代码的HTML,也可能是攻击者选择的任何代码. 不要使用addJavascriptInterface(),除非这个WebView中的所有HTML都是由你编写的. 绑定的Java对象在另一个中运行线程,而不是在它构造的线程中.
假设我有一个只显示自定义对话框的界面,或者开始下载到SD卡.这对任何网址使用都不安全吗?攻击页面如何使用该界面运行攻击者选择的任何代码?
更新: 根据文档:
此方法可用于允许JavaScript控制主机应用程序.这是一个强大的功能,但也会为针对API级JELLY_BEAN或更低级别的应用程序带来安全风险,因为JavaScript可以使用反射来访问注入对象的公共字段.在包含不受信任内容的WebView中使用此方法可能允许攻击者以非预期的方式操作主机应用程序,并使用主机应用程序的权限执行Java代码.在可能包含不受信任内容的WebView中使用此方法时要格外小心.
有没有一个如何发生这种情况的例子?这只是说DOWNLOADINTERFACE.dangerousfunction如果那个类的公共方法可以被调用?
我根据下面的漏洞利用示例进行了测试,站点可以通过Android 4.4,4.1和3.2中的接口访问系统.
但是,我没有在Android 2.2或2.3上看到这个错误,黑客只会导致强制关闭.除了不使用JSInterface之外,防止此黑客攻击的最佳方法是什么?我可以包含这样的虚假功能,以防止未经授权的功能调用吗?
public Object getClass() {
//throw error, return self, or something?
}
Run Code Online (Sandbox Code Playgroud)
或者使用ajax和拦截调用重写所有内容?这会导致更好/更差的表现吗?
更新:
我成功地删除了JS接口,并通过为所有窗口(接口)函数定义window.open(specialurl)命令来替换功能,并覆盖了shouldOverrideUrlLoading中的那些命令.奇怪的是,在某些情况下必须使用window.open(),或者webview中断显示(比如javascript正在停止?),在其他情况下应该使用location.replace或它只显示"interface:// specialdata" "无法找到消息.
(我设置了settings.setJavaScriptCanOpenWindowsAutomatically(true),因此window.open始终从JS开始工作.)
有人知道用这种行为重写应用程序的最佳方法吗?
用proguard混淆后我的项目失败了javascriptinterface
这是与proguard配置的一些建议的链接,但它不适用于我的情况
http://groups.google.com/group/android-developers/browse_thread/thread/f889e846fbf7ec3f?pli=1
所以来自Javascript的调用松散绑定到相关的Java方法
关于那个我的proguard配置
-keep public class com.trans_code.android.JavascriptCallback
-keep public class * implements com.trans_code.android.JavascriptCallback
-keepclassmembers class * implements com.trans_code.android.JavascriptCallback {
<methods>;
}
-keepclassmembers class * implements JavascriptCallback {
void on*(***);
}
-keep public class com.trans_code.** {
public protected *;
}
-keepclasseswithmembernames class com.MyActivity$JavascriptInterface
-keepclasseswithmembernames class com.MyActivity$JavascriptInterface {
public protected *;
}
Run Code Online (Sandbox Code Playgroud)
如果有人知道如何配置proguard让它过滤掉相关的方法和类,将帮助我很多
我的android项目中有一个自定义Webview,如下所示:
public class MyWebView extends WebView {
public MyWebView(Context context) {
super(context);
}
public class JsObject {
@JavascriptInterface
public void show() {
//...
}
@JavascriptInterface
public void hide() {
//....
}
}
Run Code Online (Sandbox Code Playgroud)
其中包括JavascriptInterface我用来从JavaScript端到Android端的通信.
在AndroidManifest中,我有以下内容
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
Run Code Online (Sandbox Code Playgroud)
在项目中,我使用了proguard,声明:
-keepattributes JavascriptInterface
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.
然而,当我将AndroidManifest更改为android:targetSdkVersion=18或19测试18及以上的设备时,proguard似乎在某种程度上混淆了无法访问的JavaScript方法.
如果我回到16或少于17的东西一切正常.此外,这只发生在proguard上.如果我不使用proguard,即使使用android:targetSdkVersion=18或19,一切正常.在清单Android> 17中定位时,任何人都可以帮助它吗?