1.1.1 【必须】序列化异常捕获
对于通过导出组件 intent 传递的序列化对象,必须进行 try…catch 处理,以避免数据非法导致应用崩溃。
1.1.2 【必须】NullPointerException 异常捕获
对于通过 intent getAction 方法获取数据时,必须进行 try…catch 处理,以避免空指针异常导致应用崩溃。
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 【必须】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.1 【必须】addJavaScriptInterface 方法调用
对于设置 minsdk <= 18 的应用,禁止调用 addJavaScriptInterface 方法。
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 方法调用
1.4.1 【必须】自定义 HostnameVerifier 类
自定义 HostnameVerifier 类后,必须实现 verify 方法校验域名,以避免中间人攻击劫持。
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// ......
@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);
// ......
}