相关疑难解决方法(0)

Android Proguard Javascript界面​​失败

我在我的项目中使用了这里描述的一段代码

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

java obfuscation android proguard

38
推荐指数
1
解决办法
1万
查看次数

Android JavascriptInterface安全性?

从文档: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开始工作.)

有人知道用这种行为重写应用程序的最佳方法吗?

javascript android interface webview android-webview

18
推荐指数
2
解决办法
8661
查看次数

Android proguard Javascript接口问题

用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让它过滤掉相关的方法和类,将帮助我很多

javascript android interface proguard

6
推荐指数
1
解决办法
6891
查看次数

在Android Manifest 17以上的SDK中定位SDK时,Proguard混乱Javascript接口功能

我的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=1819测试18及以上的设备时,proguard似乎在某种程度上混淆了无法访问的JavaScript方法.

如果我回到16或少于17的东西一切正常.此外,这只发生在proguard上.如果我不使用proguard,即使使用android:targetSdkVersion=18或19,一切正常.在清单Android> 17中定位时,任何人都可以帮助它吗?

javascript android proguard webview

6
推荐指数
2
解决办法
4627
查看次数