移动应用安全开发指南(Android)--数据验证


概述


移动应用往往通过数据的发送、接收和处理来完成一系列功能,通常情况下,处理的数据绝大部分都来源于外部(比如网络、内部或外部存储和用户输入等),对这些数据处理不当会导致各种各样的漏洞和风险,比代码执行和信息泄漏等等。


安全准则


A.      一般性原则:对所有外部数据进行数据验证,数据验证建议采用白名单的方式,即只允许指定的字符通过,其它字符一律过滤,同时验证数据的长度和类型等。

B.      使用参数化查询语句防止SQL注入(参考附录3)。

C.      使用WebViews时,将JavaScript和插件支持特性关掉(此为默认值),如果一定要打开该特性,需要对输出的内容进行html转义。

D.      设置禁止WebViews对文件系统进行存取,以防止文件包含漏洞。

E.       在activity内使用Intent Filter对action和data进行过滤。


详细描述


A.      进行白名单数据验证的常用方法是使用正则表达式,样例可参考附录6。

B.      预编译查询可以有效防止应用把数据当作代码来执行,样例可参考附录3。

C.      Html输出转义规则如下(详情可参考附录7):

&à&

< à &lt;

> à &gt;

“ à &quot;

‘ à '

/ à /

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("&lt;");

                                     break;

                            case ‘>‘:

                                     sb.append("&gt;");

                                     break;

                            case ‘"‘:

                                     sb.append("&quot;");

                                     break;

                            case ‘\‘‘:

                                     sb.append("'");

                                     break;

                            case ‘/‘:

                                     sb.append("/");

                                     break;

                            case ‘&‘:

                                     sb.append("&amp;");

                                     break;

                            default:

                                     sb.append(c);

                            }                

                   }

                   return sb.toString();

         }

时间: 2024-08-07 17:23:01

移动应用安全开发指南(Android)--数据验证的相关文章

ASP.NET MVC3 入门指南之数据验证[源码RAR下载]

http://www.cnblogs.com/BingoLee/archive/2011/12/23/2298822.html 前言: 无论你编写什么样的网页程序,都需要对用户的数据进行验证,以确数据的有效性和完整性. ASP.NET MVC3允许你采用一种被称之为“数据注释”的方式来进行数据验证,这种验证包含了客户端浏览器 和服务器端的双重验证.或许你会问为什么要进行两次验证?首先,客户端验证能够直接响应客户,减少了服务 器压力的同时还提高了用户体验,但是你永远不能信任来自客户端的信息(用户可

12-5【打通Flutter与Android的任督二脉】Flutter Plugin开发指南-Android端实现-1

建议先学 已经实现好了这几个类. 首先以安卓模式来打开我们的项目 在asr这个目录下,导入几个类 这几个类其实是下载的百度AI语音demo里面所提供的,里面已经提供了对百度AI的使用 首先复制这个IRecogListener IRecogListener复制过来改个名字叫做OnasrListener 这里用到了RecogResult 从demo工程里面导入RecogResult 直接复制过来即可 导入RecogEventAdpter 导入后,这里的Listener需要改成OnAsrListene

12-6【打通Flutter与Android的任督二脉】Flutter Plugin开发指南-Android端实现-2

重点实现AsrPlugin, 需要打印log.就需要一个TAG,这里定义了一个TAG 然后来添加一个方法 在里面实例化MethodChannel和我们的Dart端进行关联,参数接收一个BinaryMessager 用register.messager()获取到Message 然后来实例化Plugin.传递register 构造方法,接收一个register 重要的一步 setMethodCallHandler这样我们才能处理,来自dart端的消息. 在构造方法内获取activity.要获取act

Web安全开发指南--数据验证

1.数据验证 4.1.输入数据验证安全规则 1 数据验证必须放在服务器端进行. 2 至少对输入数据的数据类型.数据范围和数据长度进行验证. 3 所有来自不可信数据源(比如网络.用户命令.数据库和文件系统等)的数据都要进行有效验证(参考11.7 ESAPI方案). 4 来自客户端的所有参数的数据都要进行验证,比如HTTP header的键值对. 5 数据验证不通过时应默认拒绝处理该请求. 6 应尽可能地使用"白名单"而非"黑名单"的方式对数据进行验证. 4.2.输出数

移动应用安全开发指南(Android)--完结篇(http://www.bubuko.com/infodetail-577312.html)

1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP出于性能提升或用户体验等原因,将其做在客户端完成,由此导致客户端绕过等问题. 安全准则 在客户端做认证和授权是很难保证安全的,所以应该把认证和授权做在服务器端.如果确实有特殊的需求,可以和安全工程师进行沟通做单一case分析. 尽可能避免在设备上存储用户名和密码,可以使用登录认证后获得的token进行鉴权(同时注意控制token的有效期). 详细描

移动应用安全开发指南(Android)--完结篇

如果IE显示格式不正常,请使用chrome浏览器 1.认证和授权 概述 认证是用来证明用户身份合法性的过程,授权是用来证明用户可以合法地做哪些事的过程,这两个过程一般是在服务器端执行的,但也有的APP出于性能提升或用户体验等原因,将其做在客户端完成,由此导致客户端绕过等问题. 安全准则 A.      在客户端做认证和授权是很难保证安全的,所以应该把认证和授权做在服务器端.如果确实有特殊的需求,可以和安全工程师进行沟通做单一case分析. B.      尽可能避免在设备上存储用户名和密码,可以

Android L开发指南

导语:Android下一代操作系统“ L”对开发者意味着什么?ART模式能否让应用的体验超越苹果? 刚刚结束的 Google I/O大会上,Android下一代操作系统“ L”带来不少惊喜.新系统运行更快.更省电. 然而开发者对这个新系统也有颇多疑问,比如新的运行模式ART对开发者意味着什么?ART模式能否让应用的体验超越苹果?360首席技术专家任寰认为在ART运行方式下“L”的性能提升在15%到80%之间.同时,ART优化了垃圾回收方式,执行效率比现行的Dalvik提高50%以上,减少了执行垃

【Mark】Android应用开发SharedPreferences存储数据的使用方法

Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据. 1.使用SharedPreferences保存数据方法如下: //实例化SharedPreferences对象(第一步) SharedPreferences mySharedPreferences=

开发者必看|Android 8.0 新特性及开发指南

背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Android 新系统开发者预览版时已给新系统取名为 Android O.自2008 年发布以来, Android 依靠 Google 的生态运作,全球市场份额在2016年底已超过85% .而近几年依靠 Android 发展起来的智能手机厂商不断增加, Android 生态大家庭也正在不断壮大. Androi