I. 代码实现

I. 代码实现

1.1 异常捕获处理

1.1.1 【必须】序列化异常捕获

对于通过导出组件 intent 传递的序列化对象,必须进行 try…catch 处理,以避免数据非法导致应用崩溃。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        try {
            Intent mIntent = getIntent();
            //String msg = intent.getStringExtra("data");
            Person mPerson = (Person)mIntent.getSerializableExtra(ObjectDemo.SER_KEY)
            //textView.setText(msg);
        } catch (ClassNotFoundException exp) {
            // ......
        }
    }
}

1.1.2 【必须】NullPointerException 异常捕获

对于通过 intent getAction 方法获取数据时,必须进行 try…catch 处理,以避免空指针异常导致应用崩溃。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        try {
            Intent mIntent = getIntent();
            if mIntent.getAction().equals("StartNewWorld") {
                // ......
            }
            // ......
        } catch (NullPointerException exp) {
            // ......
        }
    }
}

1.1.3 【必须】ClassCastException 异常捕获

对于通过 intent getSerializableExtra 方法获取数据时,必须进行 try…catch 处理,以避免类型转换异常导致应用崩溃。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        try {
            Intent mIntent = getIntent();
            Person mPerson = (Person)mIntent.getSerializableExtra(ObjectDemo.SER_KEY)
            // ......
        } catch (ClassCastException exp) {
            // ......
        }
    }
}

1.1.4 【必须】ClassNotFoundException 异常捕获

同 1.1.3

1.2 数据泄露

1.2.1 【必须】logcat 输出限制

release 版本禁止在 logcat 输出信息。

public class MainActivity extends Activity {
    String DEBUG = "debug_version";

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        if (DEBUG == "debug_version") {
            Log.d("writelog", "start activity");
        }
        // ......
    }
}

1.3 webview 组件安全

1.3.1 【必须】addJavaScriptInterface 方法调用

对于设置 minsdk <= 18 的应用,禁止调用 addJavaScriptInterface 方法。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        mWebView = new WebView(this);
        if (Build.VERSION.SDK_INT > 18) {
            mWebView.addJavascriptInterface(new wPayActivity.InJavaScriptLocalObj(this), "local_obj");
        }
        // ......
    }
}

1.3.2 【建议】setJavaScriptEnabled 方法调用

如非必要,setJavaScriptEnabled 应设置为 false 。加载本地 html ,应校验 html 页面完整性,以避免 xss 攻击。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        mWebView = new WebView(this);
        mWebView.getSettings().setJavaScriptEnabled(false);
        // ......
    }
}

1.3.3 【建议】setAllowFileAccess 方法调用

建议禁止使用 File 域协议,以避免过滤不当导致敏感信息泄露。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        mWebView = new WebView(this);
        mWebView.getSettings().setAllowFileAccess(false);
        // ......
    }
}

1.3.4 【建议】setSavePassword 方法调用

建议 setSavePassword 的设置为 false ,避免明文保存网站密码。 建议禁止使用 File 域协议,以避免过滤不当导致敏感信息泄露。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        mWebView = new WebView(this);
        mWebView.getSettings().setSavePassword(false);
        // ......
    }
}

1.3.5 【必须】onReceivedSslError 方法调用

webview 组件加载网页发生证书认证错误时,不能直接调用 handler.proceed() 忽略错误,应当处理当前场景是否符合业务预期,以避免中间人攻击劫持。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        mWebView = new WebView(this);
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                // must check error
                check_error();
                handler.proceed();
            }
        }
        // ......
    }
}

1.4 传输安全

1.4.1 【必须】自定义 HostnameVerifier 类

自定义 HostnameVerifier 类后,必须实现 verify 方法校验域名,以避免中间人攻击劫持。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        HostnameVerifier hnv = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                // must to do
                isValid = checkHostName(hostname);
                return isValid;
            }
        };
        // ......
    }
}

1.4.2 【必须】自定义 X509TrustManager 类

自定义 X509TrustManager 类后,必须实现 checkServerTrusted 方法校验服务器证书,以避免中间人攻击劫持。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        TrustManager tm = new X509TrustManager() {
            public void checkServerTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
                // must to do
                check_server_valid();
            }
        };
        // ......
    }
}

1.4.3 【必须】setHostnameVerifier 方法调用

禁止调用 setHostnameVerifier 方法设置 ALLOW_ALL_HOSTNAME_VERIFIER 属性,以避免中间人攻击劫持。

public class MainActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // ......
        SchemeRegistry schemeregistry = new SchemeRegistry();
        SSLSocketFactory sslsocketfactory = SSLSocketFactory.getSocketFactory();
        // set STRICT_HOSTNAME_VERIFIER
        sslsocketfactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
        // ......
    }
}