移动应用安全开发指南(Android)
移动开发:iOS/Android,了解移动应用开发流程。 #生活技巧# #工作学习技巧# #编程学习路径#
概述
移动应用往往通过数据的发送、接收和处理来完成一系列功能,通常情况下,处理的数据绝大部分都来源于外部(比如网络、内部或外部存储和用户输入等),对这些数据处理不当会导致各种各样的漏洞和风险,比代码执行和信息泄漏等等。
安全准则
A. 一般性原则:对所有外部数据进行数据验证,数据验证建议采用白名单的方式,即只允许指定的字符通过,其它字符一律过滤,同时验证数据的长度和类型等。
B. 使用参数化查询语句防止SQL注入(参考附录3)。
C. 使用WebViews时,将JavaScript和插件支持特性关掉(此为默认值),如果一定要打开该特性,需要对输出的内容进行html转义。
D. 设置禁止WebViews对文件系统进行存取,以防止文件包含漏洞。
E. 在activity内使用Intent Filter对action和data进行过滤。
详细描述
A. 进行白名单数据验证的常用方法是使用正则表达式,样例可参考附录6。
B. 预编译查询可以有效防止应用把数据当作代码来执行,样例可参考附录3。
C. Html输出转义规则如下(详情可参考附录7):
&à&
< à <
> à >
“ à "
‘ à '
/ à /
D. webview.getSettings().setAllowFileAccess(false)可用于关闭WebViews对文件系统进行存取的能力。
备注
这里的外部数据包含但不限于以下来源的数据:网络、存储(特别注意外部存储)、文件、数据库、IPC和用户输入等。
如显示格式不正确,建议使用chrome浏览器
附录:
3、SQLite防止SQL注入漏洞方案
11.1.1、使用SQLiteDatabase对象自带的防SQL注入的方法,比如query(),insert(),update和delete():
DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this,"sqliteDB");
SQLiteDatabase db = dbhelper.getReadableDatabase();
/*查询操作,userInputID和userInputName是用户可控制的输入数据 */
Cursor cur = db.query("user", new String[]{"id","name"}, "id=? and name=?", new String[]{userInputID,userInputName}, null, null, null);
/* 插入记录操作*/
ContentValues val = new ContentValues();
val.put("id", userInputID);
val.put("name", userInputName);
db.insert("user", null, val);
/*更新记录操作*/
ContentValues val = new ContentValues();
val.put("id", userInputName);
db.update("user", val, "id=?", new String[]{userInputID });
/*删除记录操作*/
db.delete("user", "id=? and name=?", new String[]{userInputID , userInputName });
11.1.2、正确地使用SQLiteDatabase对象的rawQuery()方法(仅以查询为例):
DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this,"sqliteDB");
SQLiteDatabase db = dbhelper.getReadableDatabase();
/* userInputID和userInputName是用户可控制的输入数据*/
String[] selectionArgs = new String[]{userInputID , userInputName };
String sql = "select * from user where id=? and name=?";//正确!此处绑定变量
Cursor curALL = db.rawQuery(sql, selectionArgs);
11.1.3、以下为错误案例!仅供参考:
DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this,"sqliteDB");
SQLiteDatabase db = dbhelper.getReadableDatabase();
/*案例1:错误地使用rawQuery(),未绑定参数*/
String sql = "select * from user where id='" + userInputID +"'";//错误!动态拼接,未绑定变量
Cursor curALL = db.rawQuery(sql, null);
/*案例2:使用execSQL()方法*/
String sql = "INSERT INTO user values('"+userInputID +"','"+userInputName +"')";//错误同上
db.execSQL(sql);
7、HTML转义输出样例:
7.1、使用Android自带的html转义函数:String str = TextUtils.htmlEncode(str);
7.2、自定义的html转义函数:public static String htmlEncode(String str){
char c ;
StringBuilder sb = new StringBuilder();
int len = str.length();
for(int i=0 ;i<len; i++){
c = str.charAt(i);
switch(c){
case '<':
sb.append("<");
break;
case '>':
sb.append(">");
break;
case '"':
sb.append(""");
break;
case '\'':
sb.append("'");
break;
case '/':
sb.append("/");
break;
case '&':
sb.append("&");
break;
default:
sb.append(c);
}
}
return sb.toString();
}
网址:移动应用安全开发指南(Android) https://www.yuejiaxmz.com/news/view/287347
相关内容
移动应用开发技术(Android)002移动应用与系统:开发和优化的探索
探索移动应用开发:从概念到实现
移动应用开发之旅:从新手到专家
移动应用与系统:探索开发之旅
移动应用开发的未来趋势与挑战
移动应用与系统开发:现状与未来
移动应用开发之旅:从概念到实现
2024全国职业院校技能大赛移动应用开发赛题全面解析
探索移动应用开发:从基础到精通