- allowBackup属性 android:allowBackup=[“true” | “false”]
设置是否支持备份,默认值为true,应当慎重支持该属性,避免应用内数据通过备份造成的泄漏问题。
三、WebView安全
- 谨慎支持JS功能,避免不必要的麻烦。
提到对于Android4.2以下的JS任意代码执行漏洞,Android4.2以下?不必支持了吧!
-
请使用https的链接,第一是安全;第二是避免被恶心的运营商劫持,插入广告,影响用户体验。
-
处理file协议安全漏洞
//若不需支持,则直接禁止 file 协议
setAllowFileAccess(false);
setAllowFileAccessFromFileURLs(false);
setAllowUniversalAccessFromFileURLs(false);
- 密码明文保存漏洞
由于webView默认开启密码保存功能,所以在用户输入密码时,会弹出提示框,询问用户是否保存。若选择保存,则密码会以明文形式保存到 /data/data/com.package.name/databases/webview.db中,这样就有被盗取密码的危险。所以我们应该禁止网页保存密码,设置WebSettings.setSavePassword(false)
- 开启安全浏览模式
<meta-data android:name=“android.webkit.WebView.EnableSafeBrowsing”
android:value=“true” />
…
启用安全浏览模式后,WebView 将参考安全浏览的恶意软件和钓鱼网站数据库检查访问的 URL ,在用户打开之前给予危险提示,体验类似于Chrome浏览器。
四、数据存储安全;
- 秘钥及敏感信息
此类配置应当妥善存放,不要在类中硬编码敏感信息,可以使用JNI将敏感信息写到Native层。
- SharePreferences
首先不应当使用SharePreferences来存放敏感信息。存储一些配置信息时也要配置好访问权限,如私有的访问权限 MODE_PRIVATE,避免配置信息被篡改。
- 签名配置signingConfigs
避免明文保存签名密码,可以将密码保存到本地,无需上传版本控制系统
在app目录下建立一个不加入版本控制系统的gradle.properties文件:
STORE_PASSWORD = qwer1234
KEY_PASSWORD = demo1234
KEY_ALIAS = demokey
gradle将自动引入gradle.properties文件,可以直接在buld.gradle文件中使用:
signingConfigs {
release {
try {
storeFile file(“E:\FDM\Key\demo.jks”)
storePassword STORE_PASSWORD
keyAlias KEY_ALIAS
keyPassword KEY_PASSWORD
}catch (ex) {
throw new InvalidUserDataException(“You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.”)
}
}
}
五、数据传输安全
- 使用HTTPS协议
HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。可以说是非常基础的安全防护级别了。
- Android网络安全性配置
该特性让应用可以在一个安全的声明性配置文件中灵活的自定义其网络安全设置,而无需修改应用代码,满足更高的安全性要求。
在AndroidManifest.xml中配置networkSecurityConfig:
<?xml version="1.0" encoding="utf-8"?><manifest … >
<application android:networkSecurityConfig=“@xml/network_security_config”
… >
…
network_security_config文件如下:
<?xml version="1.0" encoding="utf-8"?>example.com
以 PEM 或 DER 格式将自签署或非公共 CA 证书添加到 res/raw/my_ca。这让我回想起年前听到渗透测试结果时的恐惧,好家伙,自己装了个证书…
这部分更多细节、功能请参考官方文档网络安全配置
六、其他安全问题
- 日志输出
日志是我们开发调试中不可或缺的一部分,但也是最容易泄露敏感信息的地方。所以,在我们发布应用时,应当关闭、甚至移除Log输出。
- 混淆、加固
混淆代码,可以增加反编译破解的难度。但是我们在使用混淆功能时也要注意实体类、与JS交互的方法、第三方混淆配置等问题。
应用加固也是近年来比较热门的应用安全解决方案,各大厂商都有自己的加固方案,常见的如腾讯乐固、360加固等等。
- 漏洞检测工具
当项目代码量庞大以后,积累了较多的历史代码,人工检测代码工作量大。这时,漏洞检查工具就派上用场了。中文的漏洞检测工具中比较有名的就是360的FireLine。
参考资料:
Security for Android Developers
您的 Java 代码安全吗 — 还是暴露在外?
android WebView详解,常见漏洞详解和安全源码
原文地址:https://www.jianshu.com/p/7f2202c18012
给大家的福利
零基础入门
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
因篇幅有限,仅展示部分资料