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);
// ......
}
}