细数iOS上的那些安全防护
细数iOS上的那些安全防护
作者:龙磊、黑雪、蒸米@阿里巴巴移动安全
0x00 序
随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂。这对于刚接触iOS安全的研究人员来说非常不友好,往往不知从何入手。因此,为了让大家能够更加系统性的了解iOS上的安全机制,我们从三个方面着眼:代码签名(CodeSign)、沙盒机制(SandBox) 和利用缓解(Exploit Mitigation),对iOS的系统安全机制做了一个总结。希望能够给大家的学习以及研究带来一定的帮助。注意,以下内容是以最新版的iOS 9.3.4做为标准进行讲解。
0x01 代码签名(CodeSign)
为了保护开发者的版权以及防止盗版应用,苹果系统拥有非常严格的签名保护机制。想要开发iOS程序,必须先注册开发者账号,并向苹果申请相关的证书,否则程序只能在模拟器上运行,无法在真机上调试,也无法上架App Store。除了传统的签名机制以外,苹果还额外增加了Team ID的安全防护措施,用来增强iOS系统的安全性。
(1). 传统签名机制 - 数字证书
传统的签名机制即iOS系统中使用的数字证书机制。数字证书是一种对数字内容进行校验的方法,它首先对内容使用摘要算法(例如MD5,SHA1)生成一段固定长度的hash值(可以理解为原内容的摘要),然后利用私钥对这个摘要进行加密,得到原内容的数字签名。接受方一并接收到原内容和数字签名,首先用相同的摘要算法生成原内容的摘要,同时用公钥解密数字签名,得到摘要2,然后比较摘要1和摘要2,若相同,则验证原内容有效。我们从苹果MC(Member Center)中获得的数字证书就是被苹果CA签过名的合法的证书。而iOS设备在执行app前,首先要先验证CA的签名是否合法,然后再通过证书中我们的公钥来验证app是否的确是开发者发布的,且中途没有对程序进行过篡改。理论上想要破解或者绕过这个签名机制,需要能够获取到苹果的私钥,或者能够找到签名校验过程中的漏洞。
(2). 签名校验的实现
iOS在运行代码前,都会对即将运行的代码进行签名校验。签名的校验机制是运行在内核里的。因此想要关闭这个校验的话,需要对系统进行越狱才行。内核在vm_fault_enter中规定了绝大部分情况下,具有执行位的页需要进行签名有效性检查,如果检查到该页签名无效会为进程设置kill flag。签名校验分两种情况;如果binary是platform binary,系统会直接校验binary的哈希值是否存在于trustcache中。如果binary是第三方应用程序,会先在内核在检查执行页对应hash值,而页hash对应的签名由用户态进程amfid校验其正确性。
(3). Team ID
Team ID 最早在iOS 8中被提出,在iOS 9中得到了进一步的加强。Team ID的出现主要是为了阻止攻击者将自己的动态库加载到不属于自己的executable中,常见例子:越狱过程中将动态库加载到系统进程,获得沙箱外的任意代码执行能力;恶意应用通过沙箱逃逸将自己的动态库加载到别人的app运行环境,盗取账号密码等有价值的信息。所以Team ID的具体的校验逻辑就是根据这个原则来设计。除了特殊情况,系统的进程只能加载系统的动态库。第三方app根据自己的Team ID来决定哪些具有相同Team ID的dylib能被加载。
0x02 沙盒机制(SandBox)
很多系统都有沙盒机制,但是像iOS这么复杂的却很少。iOS从UID/GID permission,MAC和entitlement三个维度实现了整个系统的沙盒机制:
(1). UID/GID permission
一般情况下,iOS会将进程的权限分为root和mobile,一些特殊的模块(比如基带)会有自己的用户组。需要注意的是,所有第三方的app都是运行在mobile权限下的。
(2). iOS Mandatory Access Control
iOS的MAC在TrustedBSD Mac Framework基础上实现,在内核具体接口、具体位置插入权限hook check(mac_** call),在发生调用时检查当前进程是否满足调用的MAC police。
而进程的MAC police主要是通过sandbox profile。Sandbox profile是苹果为每个系统进程或app预设的,例如:哪些文件可读可写,哪些不能;哪些system call可以调用,哪些不能等等。
对于系统进程,一般情况下苹果会为不同的系统进程配备不同的sandbox profile,既满足业务需求,又遵循权限最小化原则。
对于第三方app,则是统一配备名为 Container 的sandbox profile,这个profile里面的内容限制可达数千条。限制非常严格,以致于只有很少数的syscall能在第三方app内访问。一些安卓中非常普通的调用,例如fork,exec等创建子进程的系统调用,在第三方app内都是无法生效的。我们常说的沙盒逃逸,其实目的就是跳出container的sandbox profile。
(3). Entitlement
Entitlement的出现主要是为了上面两个维度都无法解决的权限检查问题。
假设有这样的场景:
进程 A 是 service 、进程 B 是 client,两者通过IPC通讯。
进程A提供的服务接口分别有:a1 , a2 ,其中只希望接口a1能被B访问。
因为检查发生在用户态,不能直接使用TrustedBSD Mac Framework,同时需要有更简单的查询方式,这样就需要在a2接口的代码中加入权限校验。基于entitlement的校验框架就是在这个需求背景下被提出来的。业务进程只需要关注entitlement的内容,而entitlement的正确性由签名保证。比如想要访问提供了能删除app的接口的”com.apple.mobile.installd”服务就必须拥有对应的”com.apple.private.mobileinstall.allowedSPI” entitlement才行。而lockdownd这个service是用于和iTunes交互来进行安装、升级、删除应用的,所以这个服务为了能与installd服务通讯,进行删除app操作,就需要拥有”com.apple.private.mobileinstall.allowedSPI” 这个entitlement:
0x03利用缓解(Exploit Mitigation)
除了常见的Stack Canaries、 ASLR和DEP等利用缓解技术之外,iOS还有很多高级的或者独有的利用缓解技术:
(1).栈金丝雀保护 (Stack Canaries)
栈金丝雀保护是已知的放置在缓冲器和控制数据之间的一个随机值。当缓冲器溢出时,最先被破坏通常是金丝雀值。因此当金丝雀的数据的验证失败的时候,就表示出现了缓冲区溢出,从而触发保护机制,并使程序停止运行。
(2).地址随机化 (ASLR/KASLR)
为了增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,用户态进程在每次启动时的执行文件基址都是随机生成的。并且,在每次手机重启后,内核kernel mach-o的基址也是随机的。
(3).数据执行保护 (DEP)
DEP是为了防止数据页执行代码。通常情况下,默认不从堆和栈执行代码。DEP会检测从这些位置运行的代码,并在发现执行情况时引发异常。在mprotect对应的内核实现中,不允许page被同时赋予执行和写这两种权限。当page的权限发生变化或一个新的page mmap到内存中的时候,vm_fault_enter会检查这个页是否有执行位,如果有执行位,会对这个页做签名检查。
(4). 堆释放元素保护 (Heap Free Element Protection)
在iOS中,如果修改一个zone中已释放的free element,当内存管理器再次分配内存到这个free element的时候会发生随机panic。具体的逻辑是,当element被释放后,内核会根据重启时创建的token生成一些内容填充在element中。这样一方面用户态无法得知填充的内容是什么,另一方面内核在分配内存的时候可以根据token知道这个element有没有被修改,如果被修改就产生panic。
(5).堆元素地址随机化 (Random Heap Element Address)
iOS系统在释放内存块的过程中,会对内存释放后在free队列中的顺序进行随机化处理,这个安全措施主要是使用攻击者无法根据堆喷接口调用的时序来预测对应元素在内核的布局。
(6).内核补丁保护 (Kernel Patch Protection)
ARMv8-A架构定义了四个例外层级,分别为EL0到EL3,其中数字越大代表特权(privilege)越大:
EL0: 无特权模式(unprivileged)
EL1: 操作系统内核模式(OS kernel mode)
EL2: 虚拟机监视器模式(Hypervisor mode)
EL3: TrustZone monitor mode
KPP就是运行在Application Process 的 EL3中,目的是用来保证:只读的页不可修改、page table 不可修改、执行页不可修改。
0x04 总结
虽然iOS有众多的安全机制和缓解措施,但这并不代表iOS系统牢不可破。有时候一些不起眼的小错误就可能导致蝴蝶效应,最终造成整个安全系统的崩盘。通过对最新的iOS 9.3.4研究,我们团队依然找到了iOS系统上的一些安全问题,甚至可以导致整个系统被控制。如下视频就演示了在最新的iOS 9.3.4上获取系统最高权限并安装cydia的过程:
视频:http://v.youku.com/v_show/id_XMTY5NjQxMDc0OA==.html
更多技术交流和进展,欢迎大家继续关注阿里移动安全。
0x05 参考资料
1. Hacking from iOS 8 to iOS 9, POC 2015.
2. ARMv8 wiki
3. To Sign and Protect – COPS in OS X and iOS, RSA 2015
4. 漫谈iOS程序的证书和签名机制
作者:龙磊、黑雪、蒸米@阿里巴巴移动安全,更多安全类技术文章,请访问阿里聚安全博客
阿里聚安全由阿里巴巴移动安全部出品,面向企业和开发者提供企业安全解决方案,全面覆盖移动安全、数据风控、内容安全、实人认证等维度,并在业界率先提出“以业务为中心的安全”,赋能生态,与行业共享阿里巴巴集团多年沉淀的专业安全能力。
阿里云EMAS专家测试手机APP测试Android和iOS上百款机型
阿里云EMAS专家测试服务覆盖Android和iOS上百种手机型号,日活过亿规模手机APP经验的阿里云EMAS测试专家,48小时输出详细测试报告,包括功能测试、性能测试、UI适配测试以及隐私合规检测等。阿里云百科来详细说下阿里云EMAS专家测试服务说明及价格:阿里云EMAS专家测试阿里云EMAS专家测试服务阿里云EMAS测试专家有着集团内部多个日活过亿规模APP经验,提供EMAS专家测试,客户只需提交测试需求,从用例设计、脚本录制、海量机型测试、整理测试结果、48小时输出专家测试报告均由阿里云EMAS测试专家一站式服务完成。覆盖功能测试、深度兼容测试、性能测试、UI适配测试以及隐私合规检测等,帮助用户以更低成本获得高质量的全面测试能力,可用于APP正式发版前验收,规避手机APP上线前或发版过程中各类隐患。更多关于阿里云EMAS专家测试服务请以官方页面为准:https://www.aliyun.com/activity/emas/mqcexpertEMAS专家测试版本及价格阿里云EMAS专家测试分为常规版和进阶版,不同版本区别如下:常规版(适用于普通发版场景)覆盖Android 300 + iOS 50 款热门机型10min脚本功能测试10min Ripper智能遍历兼容性测试UI适配测试1次免费复测进阶版(适用于较大版本迭代以及新项目上线前测试场景)覆盖Android 600+ iOS 70 款热门机型10min脚本功能测试10min Ripper智能遍历兼容性测试UI适配测试性能测试1次免费复测阿里云EMAS专家测试价格阿里云EMAS专家测试价格专家测试-Android 100:优惠价1999元/年,覆盖Android 100台次,APP常规发版必备,高bug检出率;专家测试-iOS 50:优惠价1999元/年,覆盖iOS 50台次,专家定制测试方案高bug检出率。EMAS专家测试优势提升测试效率:高检出率:EMAS独有的Ripper智能遍历技术业内领先,比传统Monkey测试bug检出率提升5倍以上全面覆盖:自动化测试工具与测试技术专家手工测试结合,覆盖全面无死角视频回溯:支持在线视频查看各类问题发生当时情况及上下文,并快速定位问题专业团队:阿里云EMAS测试专家提供服务,经历过集团内部多个日活过亿规模APP双十一等节点大考快速交付:客户只需描述测试需求,48H左右阿里云输出详尽测试报告免费复测:提供一定机型范围免费复测,护航发版体验提升终端覆盖度:海量真机:超过700款真机,覆盖国内主流机型(安卓/IOS/鸿蒙),且每月定期采购新上机型海外覆盖:同时提供海外测试服务,满足多区域测试需求降低测试成本:降低支出:省去采购手机或建立机房等固定投入及更新、折旧费用支出提升人效:协助企业测试团队更高效完成测试任务专家测试服务内容阿里云EMAS专家测试服务内容如下:需求与用例拆解:专家测试团队与客户1对1沟通测试需求,产出测试用例并与客户进行用例确认功能测试:根据用例产出测试脚本,用于业务核心流程的功能性覆盖验证兼容性测试:EMAS独有的Ripper智能控件遍历,覆盖安装、启动、运行、卸载等基础功能的适配性验证,发现潜在的兼容性问题。过程中采集应用日志、设备截图、视频等信息。可通过异常日志协助测试人员快速定位异常原因;通过测试视频帮助测试人员快速回溯UI适配测试:检测黑白屏、错位、遮挡、字体等视觉类问题,并提供缺陷描述、复现步骤、日志截图等必要的问题排查手段性能测试:手机APP性能测试通过对APP无侵入方式,在兼容性测试过程中采集核心性能指标。支持4大项共9个指标的采集分析,包括CPU/内存/FPS等隐私合规检测:阿里云EMAS隐私合规检测通过对移动App隐私安全/个人数据收集和使用进行合规分析,输出扫描报告,从形式合规+实质合规层面帮助客户规避应用下架等重大风险免费复测:提供一定机型规模的免费复测服务,用于回归验证问题是否修复提供专家测试报告:测试专家整理输出测试报告,问题分级汇总,内容清晰明确,提供问题日志协助研发尽快修复EMAS专家测试使用场景身份证自动上传、随机密码键盘识别:金融类App关系到用户的资金账户和信息安全,对App质量要求非常高。在用户上传身份证、输入随机密码等情况出现问题,直接影响留存和转化;全面护航传媒类客户APP内容质量、严谨性与用户体验:传媒类客户对于APP的质量要求天然较高,但同时如何以更低的成本(测试固定资产投入以及测试团队成本)满足自身高质量测试需求成为了测试域的一个痛点。专家测试服务中的深度兼容测试恰好可以通过大量机型以及自动化与手工测试结合的方式满足需求,且客户按需购买,实现真正意义上的降本增效;复杂手势操作,快速验证应用功能:具备机器学习的AppRipper能够智能测试应用,模拟真人操作,支持性能基线对比,快速检测出崩溃、未响应等问题,并提供通用解决方案。更多关于阿里云EMAS专家测试服务请以官方页面为准:https://www.aliyun.com/activity/emas/mqcexpert
Linux运维课程 第一阶段 重难点摘要(四)CISCO
一、路由器接口操作:
1、#show running-config 查看接口
2、#interface fastethernet 0/1 进入f0/1配置(0/1,0代表插槽1代表端口、若是s0/0/0,第一个0表示路由器本身)
3、#interface fastEthernet 0/1
#description tachingroute 接口描述
4、#do show running-config do 可让命令在其它模式运行
5、#int f0/0
#no shutdown 激活接口,接口默认是关闭状态
6、#int f0/0
#ip add 192.168.1.10 255.255.255.0 给端口配IP
#do sh int f0/0
7、#show controllers s1/0 确认此端是DCE端
#int s1/0
#clock rate 64000
#do sh contro s1/0
#bandwidth 1000
时钟频率,在生成环境下不用配置,一般由服务器运营商进行控制,时钟频率只对串口连接的路由器有效,串口用于老式的广域网连接的,主要用于E1网络(带宽2.048Mbps),现已被光纤取代。如使用串口连接两台路由器,仅在DCE端配置(数据通信设备),DTE不需配置(数据终端设备)。
8、#copy running-config startup-config 保存配置
#erase startup-config 删除配置
#reload
二、查看路由器验证配置
1、#ping IP 地址 探测IP是否畅通
2、traceroute 域名或IP 测试路由路径
3、telnet IP或域名 端口 远程管理或探测端口
4、#clear counters f0/0 清除接口的计数器
5、#show ip interface 查看接口IP信息
6、#show ip interface brief 查看所有接口的IP信息及状态
7、#show protocols 查看所有接口上的协议
三、高级IOS操作
1、路由器启动顺序
(1)路由器执行POST开机自检,检查硬件以验证设备的所有组件,POST存储在ROM中,并从中运行;
(2)bottstrap查找并加载IOS,它位于ROM中,用于启动时加载IOS,加载IOS的顺序是闪存-TFTP服务器-ROM,默认从闪存中加载IOS;
(3)IOS接管启动过程,并在NVRAM中查找启动配置文件(startup-config),破解密码的关键是忽略startup-config;
(4)如果在NVRAM中找到startup-config,复制到RAM中,生成running-config,加载登录界面,如没找到startup-config,则向所有接口发送广播,查找TFTP,用于配置路由器,若没找到TFTP,则启动用户交互设置对话模式进行初始化配置。
注:NVRAM非易失性随机存储器,指断电后仍能保存数据,用于保存永久生效的配置文件。
2、破解密码
(1)console线连接路由器,开机60秒后按ctrl+break,中断启动过程,进入rom-moritor模式,此时提示符为rommon 1>
(2)修改寄存器的值,>config 0x2142
(3)重启,>reset
(4)#copy startup-config running-config
#enable secret lamp
(5)#config-register 0x2102
#copy run start
四、思科发现协议CDP(CISCO discovery protocol)
1、#show cdp
#show cdp interface
#cdp timer 60
#cdp holdtime 180 获取定时器和保存时间信息
#cdp run 激活CDP
2、#show cdp neighbors 收集邻居信息
#showcdp entry *
#showcdp entry * protocol
#showcdp entry * version
五、路由器备份、升级和恢复
1、#copy tftp: flash:
#copy flash: tftp:
路由器的存储器主要有:
ROM:一分IOS附本;
RAM:IOS将随机访问存储器分成共享和主存,主要用来存储运行中的路由配置和与路由器协议有关的IOS数据结构;
FLASH:存储IOS软件映像,闪存是可擦除内存,能用IOS的新版本覆写;
NVRAM:存储系统的配置文件。
本文转自 chaijowin 51CTO博客,原文链接:http://blog.51cto.com/jowin/1634858,如需转载请自行联系原作者
PHP搭建网站登录页面(一个iOS开发者的PHP之路)
前言
最近几年各个技术论坛流传着一句话:未来是全栈程序员的世界!程序员作为社会的一门职业,越来越多的人加入这个行业,在这个行业内分工很明晰的情况下,越来越多的程序员开始不安分追求一门编程语言,开始在工作之余学习其他领域,渴望在不久的将来能在整个软件行业游刃有余。当然网上反对的声音也很高,这些人认为术业有专攻,应该精通一门,一个人在公司也只会负责一门技术,精力有限。
本人的看法是在这个技术日新月异的时代,iOS取代塞班也是一瞬间的事情,所以作为一名程序员强大的学习能力才是最重要的,一专多强才是非常保险的,再加上每个人走的路线是不一样的,所以没有谁对谁错,只有适不适合自己。
说明
语言基础
HTTML +CSS+ PHP
适应人群
非PHP开发者涉猎PHP技术
PHP开发新手
重要说明:本人是一名iOS开发者,正在PHP的道路上爬坑,PHP界的大牛大侠请绕路,谢谢!
技术准备
搭建PHP、MySQL、Apache服务器环境
说明:
服务器环境可以在Mac、Linux、Windows环境下均可进行搭建,搭建的过程网上资料一堆又一堆的,其中Mac上搭建环境可以参考我这一篇iOS开发–Mac下服务器搭建,搭建的过程对于新手来说也是比较繁琐和麻烦的,所以对于新手推荐 使用phpStudy软件进行一键式的搭建环境,如图
由于csdn上传资料只有60M的限制,所以需要这个软件的可以在下方评论区留下你的邮箱发给你。
这次我们做的是一个登陆页面,效果图如下:
功能实现介绍
页面运用的是HTML+CSS进行编写,验证码封装了成了一个PHP类,当用户输入账号密码以及验证码后会,先验证验证码是否正确,当验证码正确的时候php访问数据库Myuser表与用户输入的账号密码进行匹对,匹对成功后跳转到网站主页。
验证码自动生成的文件代码如下:
<?php
//验证码类
class ValidateCode {
private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子
private $code;//验证码
private $codelen =4;//验证码长度
private $width = 130;//宽度
private $height = 50;//高度
private $img;//图形资源句柄
private $font;//指定的字体
private $fontsize = 20;//指定字体大小
private $fontcolor;//指定字体颜色
//构造方法初始化
public function __construct() {
$this->font = dirname(__FILE__).'/font/elephant.ttf';//注意字体路径要写对,否则显示不了图片
}
//生成随机码
private function createCode() {
$_len = strlen($this->charset)-1;
for ($i=0;$i<$this->codelen;$i++) {
$this->code .= $this->charset[mt_rand(0,$_len)];
}
}
//生成背景
private function createBg() {
$this->img = imagecreatetruecolor($this->width, $this->height);
$color = imagecolorallocate($this->img, mt_rand(157,255), mt_rand(157,255), mt_rand(157,255));
imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
}
//生成文字
private function createFont() {
$_x = $this->width / $this->codelen;
for ($i=0;$i<$this->codelen;$i++) {
$this->fontcolor = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imagettftext($this->img,$this->fontsize,mt_rand(-30,30),$_x*$i+mt_rand(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
}
}
//生成线条、雪花
private function createLine() {
//线条
for ($i=0;$i<6;$i++) {
$color = imagecolorallocate($this->img,mt_rand(0,156),mt_rand(0,156),mt_rand(0,156));
imageline($this->img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
}
//雪花
for ($i=0;$i<100;$i++) {
$color = imagecolorallocate($this->img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagestring($this->img,mt_rand(1,5),mt_rand(0,$this->width),mt_rand(0,$this->height),'*',$color);
}
}
//输出
private function outPut() {
header('Content-type:image/png');
imagepng($this->img);
imagedestroy($this->img);
}
//对外生成
public function doimg() {
$this->createBg();
$this->createCode();
$this->createLine();
$this->createFont();
$this->outPut();
}
//获取验证码
public function getCode() {
return strtolower($this->code);
}
}
?>
登陆页面的代码如下:
<?php
session_start();
session_destroy();
?>
<html>
<head>
<title>高考成绩查询系统</title>
<style type="text/css">
#login p{
margin-top: 15px;
line-height: 20px;
font-size: 14px;
font-weight: bold;
}
body {
background-color: #0d3b5d;
margin: 0;
padding: 0;
font: Arial, Helvetica, sans-serif;
text-align:center;
text-align-last: center;
font-size:20px;
}
#login img{
cursor:pointer;
}
form{
margin-left:20px;
}
</style>
</head>
<body>
<form id="login" action="" method="post">
<p>高考成绩查询系统</p>
<p>
<span>账号:</span>
<input type="text" name="account" value="" size=15> <br/>
<br/>
<span>密码:</span>
<input type="text" name="password" value="" size=15> <br/>
<br/>
<span>验证码:</span>
<input type="text" name="validate" value="" size=10>
<img title="点击刷新" src="./captcha.php" align="absbottom" onclick="this.src='captcha.php?'+Math.random();"></img>
</p>
<p>
<input type="submit">
</p>
</form>
</body>
<?php
//打印上一个session;
//echo "上一个session:<b>".$_SESSION["authnum_session"]."</b><br>";
$validate="";
/*&&isset($_POST["account"])&&isset($_POST["password"])*/
if(isset($_POST["validate"])){
$validate=$_POST["validate"];
if($validate!=$_SESSION["authnum_session"]){
//判断session值与用户输入的验证码是否一致;
echo "<font color=red>验证码错误</font>";
}else{
require_once 'LinkDatabase.php';
$sql = mysql_query("select * from Myuser ", $connID);
while( $result = mysql_fetch_array($sql))
{
if($_POST['account']==$result['uname']&&$_POST['password']==$result['upass'])
{
include "SecondView.html";
echo "登陆成功";
header("location:SecondView.html");
}
}
}
}
?>
当用户账号密码与MySql数据库进行匹配成功的时候,会调用header("location:SecondView.html");方法,将跳转到名字为SecondView.html的主页中。
附录
实例点击代码下载
阿里云EMAS-专家测试服务iOS和Android上百种机型性能、兼容及UI等测试
阿里云EMAS专家测试服务覆盖Android和iOS上百种手机型号,日活过亿规模手机APP经验的阿里云EMAS测试专家,48小时输出详细测试报告,包括功能测试、性能测试、UI适配测试以及隐私合规检测等。阿里云百科来详细说下阿里云EMAS专家测试服务说明及价格:阿里云EMAS专家测试阿里云EMAS专家测试服务阿里云EMAS测试专家有着集团内部多个日活过亿规模APP经验,提供EMAS专家测试,客户只需提交测试需求,从用例设计、脚本录制、海量机型测试、整理测试结果、48小时输出专家测试报告均由阿里云EMAS测试专家一站式服务完成。覆盖功能测试、深度兼容测试、性能测试、UI适配测试以及隐私合规检测等,帮助用户以更低成本获得高质量的全面测试能力,可用于APP正式发版前验收,规避手机APP上线前或发版过程中各类隐患。更多关于阿里云EMAS专家测试服务请以官方页面为准:https://www.aliyun.com/activity/emas/mqcexpertEMAS专家测试版本及价格阿里云EMAS专家测试分为常规版和进阶版,不同版本区别如下:常规版(适用于普通发版场景)覆盖Android 300 + iOS 50 款热门机型10min脚本功能测试10min Ripper智能遍历兼容性测试UI适配测试1次免费复测进阶版(适用于较大版本迭代以及新项目上线前测试场景)覆盖Android 600+ iOS 70 款热门机型10min脚本功能测试10min Ripper智能遍历兼容性测试UI适配测试性能测试1次免费复测阿里云EMAS专家测试价格阿里云EMAS专家测试价格专家测试-Android 100:优惠价1999元/年,覆盖Android 100台次,APP常规发版必备,高bug检出率;专家测试-iOS 50:优惠价1999元/年,覆盖iOS 50台次,专家定制测试方案高bug检出率。EMAS专家测试优势提升测试效率:高检出率:EMAS独有的Ripper智能遍历技术业内领先,比传统Monkey测试bug检出率提升5倍以上全面覆盖:自动化测试工具与测试技术专家手工测试结合,覆盖全面无死角视频回溯:支持在线视频查看各类问题发生当时情况及上下文,并快速定位问题专业团队:阿里云EMAS测试专家提供服务,经历过集团内部多个日活过亿规模APP双十一等节点大考快速交付:客户只需描述测试需求,48H左右阿里云输出详尽测试报告免费复测:提供一定机型范围免费复测,护航发版体验提升终端覆盖度:海量真机:超过700款真机,覆盖国内主流机型(安卓/IOS/鸿蒙),且每月定期采购新上机型海外覆盖:同时提供海外测试服务,满足多区域测试需求降低测试成本:降低支出:省去采购手机或建立机房等固定投入及更新、折旧费用支出提升人效:协助企业测试团队更高效完成测试任务专家测试服务内容阿里云EMAS专家测试服务内容如下:需求与用例拆解:专家测试团队与客户1对1沟通测试需求,产出测试用例并与客户进行用例确认功能测试:根据用例产出测试脚本,用于业务核心流程的功能性覆盖验证兼容性测试:EMAS独有的Ripper智能控件遍历,覆盖安装、启动、运行、卸载等基础功能的适配性验证,发现潜在的兼容性问题。过程中采集应用日志、设备截图、视频等信息。可通过异常日志协助测试人员快速定位异常原因;通过测试视频帮助测试人员快速回溯UI适配测试:检测黑白屏、错位、遮挡、字体等视觉类问题,并提供缺陷描述、复现步骤、日志截图等必要的问题排查手段性能测试:手机APP性能测试通过对APP无侵入方式,在兼容性测试过程中采集核心性能指标。支持4大项共9个指标的采集分析,包括CPU/内存/FPS等隐私合规检测:阿里云EMAS隐私合规检测通过对移动App隐私安全/个人数据收集和使用进行合规分析,输出扫描报告,从形式合规+实质合规层面帮助客户规避应用下架等重大风险免费复测:提供一定机型规模的免费复测服务,用于回归验证问题是否修复提供专家测试报告:测试专家整理输出测试报告,问题分级汇总,内容清晰明确,提供问题日志协助研发尽快修复EMAS专家测试使用场景身份证自动上传、随机密码键盘识别:金融类App关系到用户的资金账户和信息安全,对App质量要求非常高。在用户上传身份证、输入随机密码等情况出现问题,直接影响留存和转化;全面护航传媒类客户APP内容质量、严谨性与用户体验:传媒类客户对于APP的质量要求天然较高,但同时如何以更低的成本(测试固定资产投入以及测试团队成本)满足自身高质量测试需求成为了测试域的一个痛点。专家测试服务中的深度兼容测试恰好可以通过大量机型以及自动化与手工测试结合的方式满足需求,且客户按需购买,实现真正意义上的降本增效;复杂手势操作,快速验证应用功能:具备机器学习的AppRipper能够智能测试应用,模拟真人操作,支持性能基线对比,快速检测出崩溃、未响应等问题,并提供通用解决方案。更多关于阿里云EMAS专家测试服务请以官方页面为准:https://www.aliyun.com/activity/emas/mqcexpert
iOS 福利来了,方便开发的工具库集合(四)
NSObject+KJSemaphore 轻量级解耦工具(信号)功能类型API & Property发送消息处理Instancekj_sendSemaphoreWithKey:Message:Parameter:接收消息处理Instancekj_receivedSemaphoreBlock:代码执行时间处理Classkj_executeTime:NSDictionaryNSDictionary+KJExtension功能类型API & Property是否为空PropertyisEmpty转换为Josn字符串PropertyjsonStringNSStringNSString+KJExtension 字符串扩展属性功能类型API & Property是否为空PropertyisEmpty转换为URLPropertyURL获取图片Propertyimage取出HTMLPropertyHTMLStringJosn字符串转字典PropertyjsonDict生成竖直文字PropertyverticalText获取文本宽度Instancekj_maxWidthWithFont:Height:Alignment:LinebreakMode:LineSpace:获取文本高度Instancekj_maxHeightWithFont:Width:Alignment:LinebreakMode:LineSpace:文字转图片Instancekj_textBecomeImageWithSize:BackgroundColor:TextAttributes:NSString+KJChinese 汉字相关处理功能类型API & Property汉字转拼音PropertypinYin随机汉字Classkj_randomCreateChinese:查找数据Instancekj_searchArray:字母排序Instancekj_letterSortArray:NSString+KJPredicate 谓词工具功能类型API & Property过滤空格Instancekj_filterSpace验证数字Instancekj_validateNumber是否有特殊字符Instancekj_validateHaveSpecialCharacter过滤特殊字符Instancekj_removeSpecialCharacter:验证手机号码Instancekj_validateMobileNumber验证邮箱格式Instancekj_validateEmail验证身份证Instancekj_validateIDCardNumber验证银行卡Instancekj_validateBankCardNumberNSString+KJSecurity 加密解密工具,链式处理功能类型API & Property生成keyInstancekj_createKey生成tokenInstancekj_createTokenRSA公钥加密Instancekj_rsaEncryptPublicKeyRSA公钥解密Instancekj_rsaDecryptPublicKeyRSA私钥加密Instancekj_rsaEncryptPrivateKeyRSA私钥解密Instancekj_rsaDecryptPrivateKeyAES加密Instancekj_aesEncryptKeyAES解密Instancekj_aesDecryptKeyBase64编码Instancekj_base64EncodedStringBase64解码Instancekj_base64DecodingStringNSTimerNSTimer+KJExtension功能类型API & Property当前线程计时器Classkj_scheduledTimerWithTimeInterval:Repeats:Block:当前线程Classkj_scheduledTimerWithTimeInterval:Repeats:Block:RunLoopMode:线程计时器Classkj_timerWithTimeInterval:Repeats:Block:立刻执行Instancekj_immediatelyTimer暂停Instancekj_pauseTimer重启计时器Instancekj_resumeTimer延时执行Instancekj_resumeTimerAfterTimeInterval:释放计时器Classkj_invalidateTimer:NSArrayNSArray+KJPredicate 谓词工具功能类型API & Property对比两个数组删除相同元素并合并Instancekj_mergeArrayAndDelEqualObjWithOtherArray:过滤数组Instancekj_filtrationDatasWithPredicateBlock:除去数组当中包含目标数组的数据Instancekj_delEqualDatasWithTargetTemps:按照某一属性的升序降序排列Instancekj_sortDescriptorWithKey:Ascending:按照某些属性的升序降序排列Instancekj_sortDescriptorWithKeys:Ascendings:取出 key 中匹配 value 的元素Instancekj_takeOutDatasWithKey:Value:字符串比较运算符Instancekj_takeOutDatasWithOperator:Key:Value:NSArray+KJExtension 对数组里面元素的相关处理功能类型API & Property是否为空PropertyisEmpty筛选数据Instancekj_detectArray:多维数组筛选数据Instancekj_detectManyDimensionArray:查找数据Instancekj_searchObject:映射Instancekj_mapArray:插入数据到目的位置Instancekj_insertObject:数组计算交集Instancekj_arrayIntersectionWithOtherArray:数组计算差集Instancekj_arrayMinusWithOtherArray:随机打乱数组Instancekj_disorganizeArray删除数组当中的相同元素Instancekj_delArrayEquelObj生成一组不重复的随机数Instancekj_noRepeatRandomArrayWithMinNum:maxNum:count:二分查找Instancekj_binarySearchTarget:冒泡排序Instancekj_bubbleSort插入排序Instancekj_insertSort选择排序Instancekj_selectionSort这个真的是手都复制粘贴痛了,老板们点个星星鼓励一下 - -Demo地址KJCategories、图文介绍 哆啦A梦工具库介绍备注:本文用到的部分函数方法和Demo,均来自三方库**KJCategories**,如有需要的朋友可自行pod 'KJCategories'引入即可功能介绍就到此完毕,后面有相关再补充,写文章不容易,还请点个**小星星**传送门
PINLogger:通过移动传感器窃取智能手机PIN码
本文讲的是PINLogger:通过移动传感器窃取智能手机PIN码,事实上,智能手机对于其使用者都非常了解。他们知道我们是否在一辆超速驾驶的汽车中,知道我们是在走路、骑车或者是乘坐在公共汽车上,甚至也知道我们每天接收电话的数量、时间等信息,当然对于我们解锁设备的个人识别码或者登陆时的双重验证他们更是了如指掌。而最近,研究人员设计了一种攻击方式—利用一个网站来秘密收集手机大量的数据,而这些数据目前来看准确性惊人。
目前来说键盘记录攻击最有效的是猜测四位数的PIN码,一般来说第一次输入的准确率为74%,第三次尝试的成功率为94%。相同的技术还可以用于推断其他输入,包括许多Android用户依赖锁定手机的锁定模式,尽管准确率可能会有所不同。攻击过程中只要求用户打开恶意网页,并在关闭之前输入字符就可以了,整个过程中不需要安装任何恶意应用程序。
恶意网页或浏览器可以通过基于HTML的iframe标签提供恶意广告或恶意内容,合法网站可以使用标准JavaScript代码来安装攻击,该代码可访问内置于几乎所有iOS和Android设备中的运动和方向传感器。为了说明攻击是如何工作的,英国纽卡斯尔大学的研究人员写了一个名为PINLogger.js的攻击代码。在不发生任何警告或外部预警的情况下,JavaScript能够准确地推断出输入到设备中的字符。
“这意味着每当你在网页上输入私人数据时,例如网页上都会显示一些广告横幅,则广告提供者可能会“监听”并发现你在该页面中输入的内容。新西兰大学研究人员之一的暹罗F Shahandashti向我们展示了这一攻击,“据我们所了解,当攻击进行时,在一些浏览器中如果你打开一个页面A,然后再打开一个页面B,而不关闭页面A(大多数人做的)那么页面A在后台就可以监听你在在页面B中输入的内容。”
修复困难
各种类型的攻击工作的具体条件在浏览器与浏览器之间都会有所不同,而起在一定程度上还取决于每个浏览器运行的操作系统。百度所提供的浏览器,无论是在iOS或Android上运行,都能最大限度地访问传感器。因此,当恶意网页直接加载到打开或背景浏览器标签中时,浏览器会提供敏感的传感器数据,作为iframe加载或打开或背景选项卡中,甚至是当设备屏幕被锁定时,恶意页面直接加载或作为iframe加载。相比之下,其他广泛使用的浏览器限制了对传感器数据的访问,但也仍然提供了滥用的机会。
例如,Chrome for iOS将传感器数据提供给直接加载的恶意站点,作为iframe或作为广告进入活动选项卡。但Google浏览器却会阻止访问加载到背景选项卡中的所有网站,并且iPhone被锁定也会如此。Chrome for Android除了不向传输服务器提供传感器数据之外工作原理都类似。当JavaScript直接托管或通过活动选项卡上的iframe加载而不是后台选项卡时,Android上的Firefox也可以访问传感器。与此同时,Safari具有与Firefox相同的访问权限,但是当iPhone屏幕被锁定时,Apple制造的浏览器也访问了代码。各种浏览器的条件完整总结如下表所示:
研究人员分别向Chrome,Firefox,Safari和Opera的厂商报告了这一情况。Mozilla在版本46中发布了部分修复程序,其中Firefox限制了JavaScript访问运动和方向传感器到顶级文档和同源的iframe。在2016年3月发布的iOS 9.3的Apple安全更新中,Safari在隐藏页面时暂停了运动和方向数据的可用性,采取了类似的对策。尽管这些确实是阻止PINLogger攻击的有效手段,但更新也阻止了浏览器支持一些有用的功能,例如健身和运动网站提供的功能。而Chrome则还是可以使传感器数据可用于加载到活动选项卡中的网页,Chrome开发人员在此公开承认这个问题。(Opera开发人员回应不清楚)
另外纽卡斯尔大学的研究员冯浩告诉我们,“这个问题没有直接的解决办法,也没有打破潜在有用的Web应用程序,目前没有人能够提出明确的解决方案。”
它知道你什么时候睡觉
通过访问加速度计和陀螺仪传感器,Web托管的JavaScript可以测量手机角度,旋转,移动速度和类似特征的微妙变化。这些数据反过来可以显示关于手机及其用户的敏感信息,包括每个电话的准确开始和结束以及使用它的人是不动的,行走的,在公共汽车上,在汽车中或在一列火车上。研究人员还尝试使用运行在Android 5.1.1版的Nexus 5手机上的Maxthon浏览器来进行攻击,它和运行其他浏览器的不同设备的行为也类似。
在传感器显示的所有信息中,输入的击键几乎可以说是最敏感的。研究人员使用人工神经网络训练将某些传感器测量结合到50位四位PINS中包含的特定字符中。PINLogger能够在第一次尝试时推断出准确率为74%的受试者PIN,并在五次尝试中使得准确率接近100%。相比之下,来自一组50个PIN的随机猜测在第一次尝试中只有2%的准确率,在三次尝试中也只有6%的准确性。
研究人员写道:“人们可能会认为攻击应该针对整个4位数的PIN空间进行评估。但是,我们认为,由于用户不会随机选择PIN码,因此从有限的一组PIN中进行选择时,这种攻击仍然可行。据报道,所有可能的4位数PIN码中约有27%属于一组20 PIN,包括简单的PIN,如“1111”,“1234”或“2000”。”
研究人员继续进行了一轮评估对所有可能的四位数PIN的培训。培训包括两种模式。第一种,被称为多用户模式,其被训练使用几个主题。另外一种则被称为同一用户模式,它主要依赖于攻击目标的个人的训练。研究人员写道:
我们在多用户模式的结果表明,我们可以分别在第一,第二和第三次尝试中推断成功概率为70.75%,83.27%和94.03%。这意味着对于4位数的PIN,并且基于获得的传感器数据,攻击者可以从一组3 ^4 = 81个可能的PIN 中猜测PIN ,成功概率为0.92064 = 71.82%。然而,随机攻击只能在81次尝试中以0.81%的概率预测4位数PIN。相比之下,PINlogger.js的成功率比随机攻击者高得多。
而在同一用户模式下,81次尝试中猜测PIN的成功概率为85.46%。
还有个“关键问题”
现在没有理想的方法来防止攻击,是因为如前所述,一个无法访问传感器数据的浏览器可能会阻止许多有用的程序站点进行正常工作。对于使用Chrome的用户,一个很好的做法是尽可能多地关闭标签页。研究人员警告说,除非浏览器和操作系统制造商找出更好的长期解决方案,否则威胁可能会持续增加。
他们写道:“通过JavaScript访问移动传感器数据其实仅限于几个传感器,但这一情况可能会在未来扩大,特别是随着物联网中传感器设备的快速发展,因此设计安全可用的传感器数据管理的机制仍然是未来研究的关键问题。
原文发布时间为:2017年4月25日
本文作者:Change
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
原文链接
这就是在线交易安全的未来?三因子验证工具Qkey
本文讲的是 这就是在线交易安全的未来?三因子验证工具Qkey,美国初创公司uQontrol预发布了一款三因子验证工具,声称此工具为世界首创,可以用来保护客户的在线购物交易和个人数据免受高级中间人攻击、键盘记录器和网络钓鱼欺诈的侵害。
这款工具名为Qkey,外形像一把形如钥匙的金属USB记忆棒,近看则会发现里面嵌入了一张EMV芯片。这种芯片欧洲人用在信用卡和借记卡上已经十年了,不过现在只提供给美国消费者。
用户首先要通过专用浏览器界面将他们的信用卡数据、配送信息和喜欢的网站添加到芯片中,这些信息随后会以加密数据的形式存在4GB大小的存储空间里。
想用Qkey从网站购物需要先将它插入到一台Windows PC(未来也会支持Mac)上,输入一串强密码形式的主口令(因子1)后会开启一个安全浏览器。然后,用户从电子钱包界面选择一张卡。之后,用户的手机会收到一串一次性的识别码(因子2)。输入识别码后,还得物理连接Qkey以确认付款(因子3)。
三因子层级很重要。即使窃贼偷到了Qkey实体,他还需要主口令以访问电子钱包,以及用户的手机以接收识别码。只有其中任意两样是没用的——口令输错3次以上Qkey就报废了。每个Qkey只唯一关联一名用户,因此拿到一个随机的Qkey没什么影响。
在移动支付上,目前Qkey可在Windows OS设备上工作,对Android和iOS的支持会在不远的将来完成。uQontrol公司表示,2015年晚些时候将会对Qkey进行升级,到时便能利用内置的近场通信连接这些设备。
尽管可能不是很难使用,公司依然要做好对可能出现的问题的解释工作。
如果Qkey丢失了或者用户忘记了主口令会怎样?遗失了这些数据就得由uQontrol公司进行重置,这是一个冗长的过程,因为公司显然要对每个申请者进行验证。而存储在设备上的数据,则可以在一台指定的‘家用’PC上做个加密备份。
“就像今年进入的用来保证零售交易安全的芯片和识别码卡,我们采用同样的微芯片技术创造了芯片和识别码键来使得在线购物更加安全。”uQontrol创始人和CEO克里斯托弗·茅斯说。
“然后,我们更进一步,设计出理想的在线购物体验,不仅更加安全,还很方便快捷,当然,更加吸引人。”
据茅斯所言,Qkey模仿了信用卡行业十年来一直在尝试但因给普通用户带来太多费用和复杂性而失败了的在线购物芯片和识别码终端。
说到费用,Qkey目前对先期尝试高级版的用户收费79美元(包括运费),但4月17号之后会恢复129美元的定价。这个价格里包含了可以给亲朋好友使用的一个Qkey‘基本版’,还有一个免费的替换装Qkey。不过,替换装在使用一年之后得续费49美元才能继续使用那些高级功能。
这个设计很精妙,但它的目标市场能从中赚取利润吗?
129美元的前期投入和续订服务的费用可能会令销售十分艰难。目前,这一产品尚有改进的余地,而人们也怀疑是否有必要也对Mac和两大主流手机平台提供支持以抢占市场份额。要知道,发售时间表可是4月截止期的120天之后,这可是会吓退一些人的。
目前看来,Qkey至少不太可能成为大众市场产品,如果它想建立自身商业模式就还需要一个机构性的合作伙伴。它也可以找个对手来使这一安全方法合法化——当下还没有其它产品与之类似。
毫无疑问的是:在线消费安全确实需要一剂强心针。由于Windows电脑的漏洞和强力、实惠、方便的网上身份验证系统的缺乏,太多的人在网购中上当受骗。
Qkey可能是也可能不是在线购物安全的解决之道,但考虑到现下的诸多不安全,它还很有机会上位的。
原文发布时间为: 三月 30, 2015本文作者:nana本文来自云栖社区合作伙伴安全牛,了解相关信息可以关注安全牛。原文链接:http://www.aqniu.com/tools-tech/7157.html
MQC-专业的移动应用测试平台
移动设备碎片化严重! 终端配置千差万别,不同的平台,不同的系统版本,不同的硬件配置,最终导致移动App的全机型适配成本巨大且异常困难。终端类型浩如烟海,市场上充斥着不同厂商的各个型号的设备,任何一款设备的兼容性问题都将导致大量用户流失!
产品概述
移动测试(MQC)是为广大企业客户和移动开发者提供真机测试服务的云平台,拥有大量热门机型,提供7x24全天候服务。
我们致力于提供专业、稳定、全面、高价值的自动化测试能力,以及简单易用的使用流程、贴心的技术服务,并且帮助客户以最低的成本、最高的效率发现APP中的各类隐患(APP崩溃、各类兼容性问题、功能性问题、性能问题等),减少用户流失,提高APP质量和市场竞争力。
依托于阿里深厚的移动测试技术积累,MQC针对不同的测试场景和需求,研发了一套独特的测试方法和体系,可以涵盖 Android、iOS、YunOS、H5 等不同的平台体系,我们在内部服务了手淘、天猫、聚划算、支付宝等一系列超级App,积累了丰富的移动测试经验。
同时,在发现问题 —> 定位问题 —> 解决问题 整个链路上做了非常多的优化和提升,可以帮助客户快速的发现问题,并且辅助迅速定位问题,最后通过各类修复建议促进问题快速解决。通过一整套测试能力网络,使得MQC的测试效果非常出众,远远高于业界水平。
功能特性
移动测试致力于提供专业、稳定、全面、高价值的自动化测试能力,以及简单易用的使用流程、贴心的技术服务,并且帮助客户以最低的成本、最高的效率发现APP中的各类隐患(APP崩溃、各类兼容性问题、功能性问题、性能问题等)。移动测试的机型分布涵盖了市面上几乎所有主流品牌、型号、系统版本和屏幕分辨率。目前主要包括:Android兼容性测试、Android功能测试、Android深度性能测试、Android远程真机租用、Android在线录制、iOS兼容性测试、iOS功能测试、iOS在线录制、H5测试等功能。
Android兼容性测试
本服务按照APP安装—>启动—>登录(可选)—>Ripper探索->不同版本覆盖安装(可选)—>卸载这一流程运行您的APP,同时也会获取相关的运行日志(如果有)、BUG信息(如果有)、性能数据(如果有,主要包含启动时间、CPU、内存、流量等数据),测试完成后将会提供一份兼容性测试报告。对于Android兼容性测试,免费任务的测试时长为5分钟,付费任务的测试时长为10分钟。
登录这一步骤为可选项,目前支持自动登录和脚本登录(一次测试任务中两种方法不能同时使用),在您提交测试任务时,如果您提供了测试账号和密码,测试执行时将在出现登录界面后移动测试将自动输入账号密码进行登录操作,此方法不支持需要验证码的登陆过程或者界面特殊的登录界面;如果您在提交测试任务时提供了Appium(zip压缩后的Python或Java文件)或Robotium(zip压缩过的Java文件)测试脚本,移动测试将在测试过程开始时执行您的测试脚本。两种登陆方法均支持账号池功能。
说明:Ripper探索使用了阿里集团基于机器学习开发的智能 AI 程序Ripper,具备自主决策能力,极大提高 App 测试效率。Ripper在页面覆盖度、BUG检出率上相较传统Monkey和遍历程序有明显优势。
Android功能测试
本服务将按照APP安装—>启动—>执行测试用例—>卸载这一流程运行您的APP,同时也会获取相关的运行日志(如果有)、BUG信息(如果有)、性能数据(如果有),测试完成后将会提供一份功能测试报告。报告将会以截图或者视频的形式向您展现APP的运行过程,帮助您快速进行功能回归。
本服务需要您提供一份基于Appium或Robotium测试引擎的测试脚本,Appium测试脚本支持Python和Java编程语言,Robotium脚本支持Java编程语言。本服务不提供单独的登陆步骤,请将您的登陆过程集成在测试脚本中,这里 也支持账号池功能。
功能测试的脚本执行成功率跟您测试脚本的质量有关,移动测试无法保证您的脚本一定可以得到您预期的结果。移动测试会在脚本运行过程中尽量帮助您处理掉系统弹窗,以在一定程度上提高功能测试成功率,但是您APP弹出的非系统弹窗则需要您在测试脚本中自行处理。为了提高您的脚本执行成功率,建议您在测试脚本中必要的步骤后增加相关的校验或处理步骤(例如:在可能出现弹窗的地方进行相关判断和处理、在界面切换或网络请求等时间不可控的步骤后增加等待时间防止由于界面未完全加载而导致找不到控件等)。
您可以通过Android在线录制生成一份测试脚本或者直接保存成测试用例,可以减轻您的脚本编写负担。
Android功能测试的测试时长限制在30分钟以内,如果您的测试用例或脚本的执行时间过长,移动测试将在超时后主动结束本次测试任务,不会继续执行用例或脚本;你可以将用例或脚本合理拆分,分解成多个任务提交测试,或者联系移动测试为您提供个性化支持。
同时,针对金融类客户,我们支持随机密码键盘的输入操作,提高功能测试的适用范围。
Android远程真机租用
远程真机租用向您提供在线远程操作移动测试设备的功能,您可以实时看到设备的屏幕、以及执行屏幕或者按键操作,例如:点击、滑动、输入文本等。本服务方便您在发现APP在某些机型上存在问题而手边没有对应设备时,快速复现您APP的异常和问题。
Android&iOS在线录制
在线录制可以记录您在移动测试设备上的操作轨迹,快速生成对应的功能测试用例和脚本。支持点击、滑动、文本输入、等待等常用操作。生成的测试脚本通过xpath、控件id、文字等多种方式查找控件,明显提高了功能测试的成功率。针对iOS系统不同版本间xpath或元素类型变化等问题,移动测试做了大量适配工作。
说明:由于APP之间存在大量差异,移动测试无法适配所有情况,无法保证在线录制生成的脚本一定运行成功。为了保证生成的测试用例或脚本在功能测试中有较高的成功率,您在录制时应尽量从APP安装完成启动时开始录制,不要漏掉某些操作步骤;对于非系统弹框,也需要您进行针对性的处理;在录制界面切换或网络请求这类时间不可控的步骤后,请加上一定的等待时间,避免在功能测试时因为这些因素而出现找不到控件的问题。
Android深度性能测试
深度性能测试能协助测试人员发现APP中存在的深层次性能问题,直接定位多项性能问题及瓶颈的根本原因,方便您快速做出针对性地修改,提升APP性能表现,使得APP运行得更加稳定。
深度性能测试现在提供内存泄露、内存溢出、GC监控、界面流畅度和卡顿检测、过度绘制检测、启动分析、严苛模式(StrictMode)分析、安装包分析等功能。分别从内存表现、绘制和响应表现、启动表现、安装包等四个方面对APP性能做出来全面的分析。
iOS兼容性测试
本服务按照安装—>启动—>自动登录(可选)—>智能探索—>卸载的流程在您选定的设备上运行您的APP,移动测试目前的iOS机型涵盖iPhone 4S到iPhone 7/7P,系统版本涵盖iOS 8到iOS 10。方便您快速针对iOS机型进行全覆盖测试。自动登录只需要您提供测试账号和密码就可以帮您快速登录,这里暂不支持需要验证码和比较特殊的登录界面。本服务将收集设备在APP运行期间输出的BUG日志(如果有),并将录制测试过程的APP运行视频,方便您快速查看问题。iOS兼容性测试免费任务的测试时长为5分钟,付费任务测试时长为10分钟。
iOS功能测试
本服务按照安装—>启动—>执行脚本—>卸载的流程运行您的APP。测试脚本目前支持Appium和UI Automation(由于iOS的限制,UI Automation脚本仅支持iOS 8及之前版本的设备)测试框架。移动测试将会录制APP的运行视频,方便您快速发现功能问题。
用于iOS功能测试的Appium脚本仅支持Python语言,UI Automation脚本仅支持JavaScript语言。
功能测试的脚本执行成功率跟您测试脚本的质量有关,移动测试无法保证您的脚本一定可以得到您预期的结果。移动测试会在脚本运行过程中尽量帮助您处理掉系统弹窗,以在一定程度上提高功能测试成功率,但是您APP弹出的非系统弹窗则需要您在测试脚本中自行处理。为了提高您的脚本执行成功率,建议您在测试脚本中必要的步骤后增加相关的校验或处理步骤(例如:在可能出现弹窗的地方进行相关判断和处理、在界面切换或网络请求等时间不可控的步骤后增加等待时间防止由于界面未完全加载而导致找不到控件等)。
您可以iOS在线录制生成测试脚本或用例,减轻您的脚本编写负担。
iOS功能测试免费任务的测试时长限制在5分钟以内,付费任务的测试时间限制在20分钟以内,如果您的测试用例或脚本的执行时间过长,移动测试将在超时后主动结束本次测试任务,不会继续执行用例或脚本;你可以将用例或脚本合理拆分,分解成多个任务提交测试,或者联系移动测试为您提供个性化支持。
H5测试
H5测试可以在不同手机浏览器下测试您的页面加载情况。H5测试从资源加载、白屏时间、网页大小、网页复杂度等方面对您的页面加载性能做出全面分析, 方便快速发现H5问题。
MQC测试平台是为广大企业客户和移动开发者提供真机测试服务的云平台,拥有大量热门机型,提供7x24全天候服务。
我们致力于提供专业、稳定、全面、高价值的自动化测试能力,以及简单易用的使用流程、贴心的技术服务,并且帮助客户以最低的成本、最高的效率发现APP中的各类隐患(APP崩溃、各类兼容性问题、功能性问题、性能问题等),减少用户流失,提高APP质量和市场竞争力。
联系我们: 网站地址:https://mqc.aliyun.com/ 开发者交流旺旺群:335334143 客服邮箱:mqc_group@service.alibaba.com;更多精彩技术分享 欢迎关注 MQC公众号
OAuth2.0 协议入门指南
本文希望以应用场景的角度出发,帮助大家快随了解OAuth协议流程,更为清楚明白的介绍在各种情况使用什么授权模式更为合适。OAuth2 官网原文地址
本系列相关文章:OpenID Connect 协议入门指南SAML2.0入门指南
1. 协议中各种角色:应用、API和用户
第三方应用:客户端
客户端,即尝试去获得用户账号信息的应用,用户需要先对此操作授权。
API: 资源服务器
即资源服务器,提供用来获得用户信息的API。
授权服务器
授权服务器用来提供接口,让用户同意或者拒接访问请求。在某些情况下,授权服务器和API资源服务器会是同一个,但是在大多数情况下,二者是独立的。
用户:资源的拥有者
资源的拥有者,当前的请求正在尝试获得他们账户的部分信息。
2. 创建App
在开始OAuth流程之前,你首选需要注册一个新应用到服务器。通常在注册的过程中,需要提供应用的基本信息,比如应用名称、网站信息、logo等等。此外,你还需要注册一个重定向URI,用以将用户通过浏览器或者移动客户端重定向回Web服务器,这个URI很重要,在后面的我们会具体讲到。
2.1 重定向URI
服务器只会把用户重定向回注册过的URI以避免一些安全攻击。任何HTTP的从定向请求都必须使用TLS保护,所以要求使用HTTPS。这样的要求是为了防止token在传输的过程中被截获。对于原生APP,重定向的URI可以被注册为一个自定义的URL scheme,比如
demoapp://redirect
2.2 Client ID & Secret
当注册完毕之后,一般会返回给用户一个客户端ID(Client ID)和一个客户端密钥(Client Secret)。这个ID一般是公开的信息,用来构造登录URL,或者被包含在页面的JS代码中。这个密钥(Secret) 必须是保密的。如果一个已经部署的应用不能保护密钥,比如一个简单的JS网页,则不应该使用客户端密钥,同时理论上服务器也不应该向这类应用颁发密钥。
3. 授权:得到授权码
OAuth 2流程的第一步是获得用户的授权。对于基于浏览器应用或是移动应用,这一步通常是在服务器显示给用户的接口上完成。
OAuth 2提供了多种授权模式(grant types),根据不同的情况而使用。
授权码模式:适用于Web应用、浏览器应用或是移动APP;
口令模式:适用于使用用户名和口令登录的模式;
应用访问模式:适用于应用访问;
默认模式:之前被推荐在没有Secret情况下使用,现在被没有客户端密钥的授权码模式取代。
每一个模式的使用细节将在下面的章节中说明。
3.1 Web服务
Web服务是最常见的应用类型。用户所使用的Web App程序运行在服务器端,其源码不会公开暴露,这就代表着这类应用在授权的过程中可以使用客户端密钥(Client Secret),以避免某些攻击手段。
3.1.1 授权
创建登录链接,将用户重定向到授权服务器:
https://oauth2server.com/auth?response_type=code&
client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx
code: 代表服务器希望收到授权码;
client_id: 注册应用时颁发的ID;
redirect_uri: 指明当用户授权完成之后返回的地址;
scope: 一个或多个值,用来指明希望获得用户账户哪部分权限;
state:由应用生成的一个随机字符串,会在稍后的过程中去验证。
通过以上的链接,用户将会看到如下的界面
image.png
当用户点击“Allow”之后,授权服务器会把用户重定向回应用网站,并在链接中带上授权码:
https://oauth2client.com/cb?code=AUTH_CODE_HERE&state=1234zyx
code: 服务器返回的授权码;
state: 返回请求授权码过程中发送的state;
当应有接收到这个请求时,要首先验证state是否就是应用刚才发送的值。在发送state之后,可以把state保存到Session以便于后续的比较。这样做的目的是防止应用接受任意伪造的授权码。
3.1.2 换取Token
然后使用授权码到资源服务器换取Token:
POST https://api.oauth2server.com/token
grant_type=authorization_code&
code=AUTH_CODE_HERE&
redirect_uri=REDIRECT_URI&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
grant_type=authorization_code - 代表授权模式为验证码;
code=AUTH_CODE_HERE - 验证码;
redirect_uri=REDIRECT_URI - 重定向URI;
**client_id=CLIENT_ID **- 注册应用时颁发的ID;
client_secret=CLIENT_SECRET - 客户端密钥,因为当前请求时服务器之间传输的,并没有暴露给用户。
API服务器会返回授权码和其有效期:
{
"access_token":"RsT5OjbzRn430zqMLgV3Ia",
"expires_in":3600
}
或者是授权失败的提示:
{
"error":"invalid_request"
}
安全性提示:服务器要求应用必须提前注册从定向URI
3.2 纯页面应用
纯页面应用,也称为浏览器应用,其所有运行代码都会加载到本地的浏览器上。因此其代码会暴露给使用者的浏览器,不能保护客户端密钥的安全,所以客户端密钥不能在这种情况下使用,除此之外其和Web应用没有太大区别。
以前,曾经推荐使用默认模式(implicit type),该种模式将会直接返回token,并不使用授权码来换取token。但是到了本文编写之时,业界已经开始转为推荐使用没有Scret的授权码流程,这样这样协议流程更为安全,具体内容请见引文: Redhat, Deutsche Telekom, Smart Health IT.
3.2.1 授权
创建登录链接,将用户发送至授权服务器:
https://oauth2server.com/auth?response_type=code&
client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx
code - 指明使用授权码模式;
client_id - 注册时颁发的client ID;
redirect_uri - 重定向URI,代表当授权完成之后,返回的路径;
scope - 一个或多个值,代表所希望访问当前用户的那部分信息;
state - 由于后续步骤验证实用的随机字符串。
之后,同样用户会显示授权页面:
image.png
当用户点击“Allow”,授权服务器依据重定向URI将用户返回到应用网站:
https://oauth2client.com/cb?code=AUTH_CODE_HERE&state=1234zyx
code - 授权服务器返回的授权码;
state - 登录请求中发出的随机码;
应有服务器收到该请求之后,应该先核对state的值,以避免接受伪造的授权码;
3.2.2 换取Token
POST https://api.oauth2server.com/token
grant_type=authorization_code&
code=AUTH_CODE_HERE&
redirect_uri=REDIRECT_URI&
client_id=CLIENT_ID
grant_type=authorization_code - 代表授权模式为验证码;
code=AUTH_CODE_HERE - 验证码;
redirect_uri=REDIRECT_URI - 重定向URI;
**client_id=CLIENT_ID **- 注册应用时颁发的ID;
3.3 移动APP
以前,曾经推荐使用默认模式(implicit type),该种模式将会直接返回token,并不使用授权码来换取token。但是到了本文编写之时,业界已经开始转为推荐使用没有Scret的授权码流程,这样这样协议流程更为安全,
类似于纯页面应用,移动应用不能包含客户端密钥,所以使用的是没有客户端密钥的Oauth流程。此外,对于移动APP,还有一些特别地方需要注意。
3.3.1 授权
创建一个登陆按钮,将用户跳转到服务器在手机上原生APP,或是通过手机的浏览器跳转到服务器Web页面、无论是IOS还是Android,都可以通过URL Scheme协议启动本地APP;
3.3.1.1 使用服务器的APP
如果用户安装了服务器的原生APP,比如微博APP或是微信APP,可以通过URL来直接启动APP:
fbauth2://authorize?response_type=code&client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI&scope=email&state=1234zyx
code - 指明使用授权码模式;
client_id - 注册时颁发的client ID;
redirect_uri - 重定向URI,代表当授权完成之后,返回的路径;
scope - 一个或多个值,代表所希望访问当前用户的那部分信息;
state - 由于后续步骤验证实用的随机字符串。
对于还要支持PKCE extension的服务器,还需要创建一个随机字符串("code verifier")保存本地,然后再URL中追加如下参数:
code_challenge=XXXXXXX - 过base64编码后的"code verifier"的Hash值;
code_challenge_method=S256 - 指明Hash算法种类,这里是sha256;
需要说明的是,这里的URL用的协议App提前向操作系统定义好的。
3.3.1.2 使用手机Web浏览器
如果服务器在手机上没有一个原生的APP,也可以通过手机浏览器上来走标准的Web认证流程。这里需要注意的是,不要使用应用内置的WebView,因为这样就不无法保证用户正在登陆网站是不是伪造的。
一般是使用移动端的原生浏览器,对于IOS 9+版本的用户,可以使用“SafariViewController”在应用中启动嵌入浏览器,这个API会显示地址栏让用户判断是否打开正确的网页,同时还提供和Safari浏览器共享cookie的功能。该API能保证应用被注入和修改,所以可以被认为是安全的。对于Android开发者,可以考虑使用Chrome Custom Tabs来提供类似的功能。
https://facebook.com/dialog/oauth?response_type=code&client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI&scope=email&state=1234zyx
参数的意义和使用服务器原生APP的情况是一样的。比如用户登录FaceBook,就会在手机上看到如下界面:
everyday-city-auth.png
3.3.2 换取Token
当用户点击"Approve"之后,用户将会被重定向到应用,同样可以使用URL Scheme:
fb00000000://authorize#code=AUTHORIZATION_CODE&state=1234zyx
应用收到该请求之后,要先比较state的值是否满足预期,然后用授权码来换取Token。
换取Token的过程和在Web中请求类似,只不过没有加入Client Secret。如果服务器需要支持PKCE,则还需要添加更多的参数:
POST https://api.oauth2server.com/token
grant_type=authorization_code&
code=AUTH_CODE_HERE&
redirect_uri=REDIRECT_URI&
client_id=CLIENT_ID&
code_verifier=VERIFIER_STRING
grant_type=authorization_code - 标识这是授权码模式;
code=AUTH_CODE_HERE - 授权码;
redirect_uri=REDIRECT_URI -重定向URL;
client_id=CLIENT_ID - Client ID;
code_verifier=VERIFIER_STRING - 之前步骤中,生成的随机字符串
如果服务器支持PKCE,则授权服务器需要能“Code-Challenge”中识别code,也就是提供再次对code_verifier进行Hash,并且比较计算出的Hash值和之前的code_challenge是否一致,以此代替Client Secret,保证安全性。
3.4 其他授权模式
3.4.1 口令模式
这种模式直接使用用户名和口令来取回Token。很显然,这要求应用去收集用户的口令,所以只建议当前的APP是专门为服务器设计的情况下使用。比如Twitter的App使用该模式登录。
POST https://api.oauth2server.com/token
grant_type=password&
username=USERNAME&
password=PASSWORD&
client_id=CLIENT_ID
grant_type=password - 指明使用口令模式;
username=USERNAME - 用户名;
password=PASSWORD - 口令;
client_id=CLIENT_ID - client ID;
资源服务器返回的Token和其他模式是一样的。值得注意的是,因为口令模式多用于移动端和桌面应用,使用Secret并不合适。
3.4.2 应用访问模式
在一些情况下,是应用去访问服务区获取资源,而不是某个用户。比如应用去获取一些服务在应用配置信息,这些信息不属于某个用户的。在这种情形下,应用也需要被授权,得到Token去访问数据,这就是应用访问模式的意义。
OAuth提供了client_credentials模式来结局这个问题:
POST https://api.oauth2server.com/token
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
资源服务器返回形式和其他模式是相同的。
4. 创建已经授权的请求
最后就是使用Token获取资源,如何表面一个请求是已经呗授权?就是Http的头中加入Token:
curl -H "Authorization: Bearer RsT5OjbzRn430zqMLgV3Ia" \
https://api.oauth2server.com/1/me
另外还要确保是使用HTTPS通信,这样才能确保信息安全。
5. 与OAuth 1.0版本的差异
最后说明下两个版本的OAuth协议有什么不同点。
5.1 认证和签名
OAuth 1.0 流程中有大量密码学上的签名操作,以保证数据完整性;OAuth 2中有HTTPS来保护数据。
5.2 用户体验
和OAuth 1.0相比,OAuth 2在移动端的体验更好。
5.3 性能
和OAuth 1.0相比,OAuth 2性能更好,减少了流程的步骤。
其他参考
Learn more about creating OAuth 2.0 ServersPKCE ExtensionRecommendations for Native Apps
More information is available on OAuth.net
Some content adapted from hueniverse.com.