概述 html |
移动应用每每经过数据的发送、接收和处理来完成一系列功能,一般状况下,处理的数据绝大部分都来源于外部(好比网络、内部或外部存储和用户输入等),对这些数据处理不当会致使各类各样的漏洞和风险,比代码执行和信息泄漏等等。web |
|
安全准则 正则表达式 |
A. 通常性原则:对全部外部数据进行数据验证,数据验证建议采用白名单的方式,即只容许指定的字符经过,其它字符一概过滤,同时验证数据的长度和类型等。sql B. 使用参数化查询语句防止SQL注入(参考附录3)。chrome C. 使用WebViews时,将JavaScript和插件支持特性关掉(此为默认值),若是必定要打开该特性,须要对输出的内容进行html转义。数据库 D. 设置禁止WebViews对文件系统进行存取,以防止文件包含漏洞。浏览器 E. 在activity内使用Intent Filter对action和data进行过滤。安全 |
|
详细描述 网络 |
A. 进行白名单数据验证的经常使用方法是使用正则表达式,样例可参考附录6。app B. 预编译查询能够有效防止应用把数据看成代码来执行,样例可参考附录3。 C. Html输出转义规则以下(详情可参考附录7): &à& < à < > à > “ à " ‘ à ' / à / D. webview.getSettings().setAllowFileAccess(false)可用于关闭WebViews对文件系统进行存取的能力。 |
|
备注 |
这里的外部数据包含但不限于如下来源的数据:网络、存储(特别注意外部存储)、文件、数据库、IPC和用户输入等。 |
如显示格式不正确,建议使用chrome浏览器
附录:
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);
String str = TextUtils.htmlEncode(str);
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();
}