Tech
导读 本文旨在站在测试开发工程师的角度将功能安全测试归入日常测试中,简单剖析了功能安全测试与功能测试的异同点以及SDL中各环节的职责所在,同时分析了针对不同的安全场景如何进行功能安全测试用例的设计。通过本文,读者可以对SDL有一个简单明了的理解,针对SDL中各个环节,产研测的职责和关注点是什么都能有一个明确的概念。通过阅读本文,可以重点关注如何结合实际功能安全点设计符合需求的功能安全测试用例。 00前言
测试开发工程师一直想将安全测试真正融入测试工作中,在测试工作过程中,测试工程师一般会更加注重对于功能的测试,对于安全测试,关注度则较低。直到前不久众所周知的用户信息泄露问题的发生,人们才真正的意识到安全测试的重要性。一提起软件安全,大部分人首先想到的都是信息泄露,无论是通过购物平台泄露,还是在浏览网页信息,好像都无法避免信息的泄露。
其实,除了信息泄露,在软件的整个开发和使用过程中,都有可能存在安全隐患,比如,数据库信息的泄露,黑客恶意攻击,后台的数据篡改等。与其他岗位的人不同的是,测试工程师不仅要知道信息泄露,在软件开发周期中所有环节可能涉及的安全问题也是测试工程师需要一并关注的问题。那什么是安全测试?为何进行安全测试?在工作过程中,如何开展安全测试呢?那接下来,就此好好聊聊吧!
01What?Why?
1.1 What?--请问什么是安全测试呢?
安全测试是在软件产品开发基本完成时,验证产品是否符合安全需求定义和产品质量标准的过程。安全测试是检查系统对非法侵入渗透的防范能力。
1.2 Why?--为什么进行安全测试呢?
1)进行安全测试,原因之一是为了提升IT产品的安全质量;
2)同时,也是为了尽量在发布前找到安全问题予以修补降低成本;
3)验证安装在系统内的保护机制能否在实际应用中对系统进行保护,使之不被非法入侵,不受各种因素的干扰。
02安全测试的目标
安全测试的目标就是要通过对系统进行精心、全面的脆弱性安全测试,发现系统未知的安全隐患并提出相关建议,确保系统的安全性。主要分为应用程序级别和系统级别的安全测试两类。
图1 安全测试目标
03安全测试与功能测试的区别
安全测试与功能测试,同属于测试工作的范畴,那二者必然有相同和不同之处,从大量相关测试经验中可以总结出安全测试与功能测试的相同点和不同之处:
Same
Summary | Detail |
---|---|
目标类似 | 都是尽早反馈系统的缺陷 |
过程类似 | 了解需求→设计并编写用例→用例评审→测试用例执行→产出测试报告 |
提前预测 | 会对不同的业务场景有目的的进行探索,对研发代码时刻保持警惕 |
Different
Summary | 功能测试 | 安全测试 |
---|---|---|
目标不同 | 发现设计、编码等产生的BUG | 发现安全隐患 |
问题发现模式不同 | 违反功能定义为判断依据 | 违反权限与能力的约束为判断依据 |
预测内容不同 | 以系统所具有的功能为思考域 | 要预测安全隐患 |
04安全测试的基本过程
4.1 安全开发生命周期
SDL( Security development lifecycle )即安全开发生命周期,是微软提出的从安全角度指导软件开发的过程。将安全的考虑集成在软件开发的每一个阶段,利用威胁模型改进安全流程。
图2 SDL流程
一个完整的安全开发流程包含从需求调研到运维整7个阶段,每个阶段都有其相应的安全职责。通过下图可以很清晰的看到每个阶段的职责所在。
需求阶段和培训阶段,是产品同事需要关注的阶段。在需求阶段,产品人员需要通过需求调研对此次需求中涉及到的安全点进行评估,并将安全需求点落实到prd中。如,京喜达财务系统,网格站代理佣金需求中,页面需要展示财务结算同事的姓名,电话,邮箱信息等敏感信息,产品需要将此需求在安全说明部分进行声明。在培训阶段,需要对该功能的使用者进行线上或线下的相关培训,培养他们的安全意识等。
设计和研发阶段,是需要研发同事关注并做到的,他们在开发设计过程中需要对prd中的安全点考虑在内,包含对可能的攻击面的分析和安全API以及组件的开发等。
测试阶段,是测试同事需要格外关注的阶段。在这个阶段,研发同事的工作已经完成,测试同学介入,需要在全面的测试展开前,就应该提前对prd进行梳理,预测可能存在的安全问题,将其落实到测试case中,防止测试点遗漏,还需要组织相关人员对此进行用例评审,在测试展开过程中,需要对此次需求的安全点进行验证,同时还要保证,本次的改动点不会影响其他功能的正常使用。最后需要输出一份测试报告。
上线阶段,测试和研发一起关注。在此阶段,研发和测试同学需要关注上线的过程中是否会出现问题,要进行安全漏洞的监控与扫描,保证上线过程中不会出现漏洞,同时,还需要编写一份应急方案,方便运维等人员的使用。
运维阶段,是运维同事需要关注的阶段。在此极端,需要定时进行安全巡查,保证软件在使用过程中不会出现安全问题,一旦出现安全问题,在执行应急方案的同时,需要对此情况进行上报,与研发一起解决这个安全问题。
4.2 安全测试流程
图3 安全测试流程
05常见安全测试的验证点
1.1 What?--请问什么是安全测试呢?
序号 | 功能安全测试验证点 | 详细说明 |
---|---|---|
1 | 业务逻辑漏洞 | 1、金额数据、商品数量篡改2、最大数限制修改3、修改金额,如无后端校验情况下,0.01元买到了价值100元的商品 |
2 | 登录与身份验证 | 1、用户名与密码不一致时进行校验,无法登陆2、验证码未限制一次性使用 3、验证码可无限次获取--造成短信轰炸4、密码有提示--生日 身份证后几位等5、修改密码时校验原密码--新密码与原密码不可一致6、流水号有规律--其余用户可根据此规律遍历获取数据7、重复注册与登录--同一个用户名注册多次和重复登陆8、缺少账号密码锁定机制(无限次重试)9、密码强度--大小写and特殊字符and长度 |
3 | 越权测试 | 1、手动更改url的参数访问无权访问的页面(http)2、拿到更高权限人员的账号和密码,通过接口调用等方式进行操作3、人员权限和数据权限思虑周全(总部和省区权限不同等) |
4 | 文件上传与下载 | 1、文件上传次数不做校验,使得恶意上传,沾满资源池2、文件的类型和大小不做控制3、任意文件均可下载,导致有木马病毒等(对于有安全隐患的不应该允许下载)4、可以通过../../等方式跳转到其他目录获取相关重要文件5、不登录系统,直接输入文件url可直接下载 |
5 | 敏感信息 | 1、数据库/日志/提示等泄露2、人员的邮箱电话等信息(如数据库加密,页面脱敏)3、使用https密文传输,非http明文传输 |
6 | Sql注入 | 1、get型注入2、post型注入3、cookie型注入4、登录认证型注入 |
7 | 重要数据 | 重要文件附加水印 |
06举例说明如何进行功能安全测试
在测试过程中,要转换看问题的视角,在测试过程中,要将自己定位为恶意破坏规则的用户,以破坏的视角看待问题。同时,无论是在理解prd还是编写测试用例的时候,要以专业的态度识别出其中有价值的数据。
如下面两张图,在测试过程中,要时刻站在左图种右边的角色--恶意用户的立场去考虑场景,思考面对这样的功能,他会以什么方式破坏系统。同时,在看待prd中的功能点时,要多角度考虑问题,既要考虑到它的好处,同时也要考虑到它是否存在安全隐患,如从不同角度看待问题,会有不同的结果(如右图,可以看到两个人脸,或者一个台子)。(图片来源于网络)
图4 不同视角看问题
在阐述如何进行功能安全测试用例编写之前,先简单介绍下公司组织架构,公司组织架构由上到下分别为总部→区域→加盟网点或网格站。同时,总部、区域人员细分各个岗位,各岗位分别负责不同的相关工作。
图5 组织架构简图
接下来,以工作中涉及的相关需求测试举例说明,在功能安全测试方面,如何进行功能安全测试用例编写与测试工作:
以案例一为例,说明如遇到权限问题时,测试用例该如何设计:
案例一 报价提报流程线上化
需求背景:省区报价人员对不同的网格站配置不同的报价,以实现对加盟网点产生的费用进行收取和支付款的功能。目前区域提报网格站的报价流程是区域线下邮件申请,总部进行线下邮件审核,为了提高区域提报报价的审批效率,急需报价线上化审批功能。该需求中涉及到的主要功能有:
1、省区报价岗位可以提报报价、编辑及变更自己提报的报价;
2、有报价审批权限的人员(含省区和总部的部分人员)可以审核、查看报价,审核过程中可对报价部分内容进行修改;
3、邮件通知报价提报人员、省区相关负责人进行报价确认;
4、相关网格站进行报价确认。
面对这个需求,首先要充分分析prd,应该想到的是该需求涉及的人员角色巨多,且每个角色有着对报价的不同的权限,因此,在考虑测试用例时,要充分考虑人员的权限问题,如网格站除报价确认和接收邮件外无任何权限,若研发将报价审批的权限赋予了他或者校验不严谨则可能会使得黑客篡改权限,则存在流程被恶意审批的存在,因此测试用例可以这样设计:
图6 权限相关测试用例示例
以案例二、三为例,简单说明遇到有重要数据和敏感信息及操作时应如何设计测试用例:
案例二 预付款提现需求
加盟网点与京东物流签约后,会生成自己的账户,加盟网点可以对其账户进行充值操作或将其账户的余额提现至银行卡。因此加盟网点的提现过程是否卡控严谨将直接关系到公司的资金利益,在梳理完提现流程prd后,可以将其中的功能安全点概括如下:
1、加盟网点存在未开发票不允许提现;
2、提现时对提现周期有限制;
3、账户余额会限制提现;
4、加盟网点状态影响提现;
5、一旦提现申请发起,应该立马扣减余额;
6、提现申请发起后,需要一系列审批才可真正提现;
7、校验提现信息的真实性、正确性。
案例三、电子合同需求
网格站与京东物流签约需要生成电子合同,其中涉及的部分功能有:省区相关人员可以新增电子合同,在新增电子合同时,需要展示合伙人的手机号和账号,还要填写履约保证金等金额,且上传对应图片(要求格式是图片格式)等文件。网格站在签署电子合同时,需要预览合同内容以及合伙人手机号,同时签署合同时还要获取验证码校验,除此,网格站人员还可以下载合同进行查看。
通过对这部分的功能梳理,可以概括以下几个测试点:
1、合伙人手机号和账号属于敏感信息;
2、过程中需要上传文件,其中履约保证金必须是图片格式;
3、签署合同需要获取验证码,验证码次数和生效时间等需要格外考虑;
4、履约保证金、合同属于重要数据和文件。
因此,结合这两个案例,我们可以这样设计测试用例并展开测试:
图7 敏感数据&操作测试用例示例
特别的,前端修改数据场景可参考下图进行测试:
图8 手动修改前端数据示例
07总结
随着信息社会的不断进步,信息安全的重要性日渐突出,安全测试与功能测试一样,在软件测试过程中,是一个非常重要的测试环节。在软件开发过程中进行安全测试,能够避免数据泄露等安全问题,从而保障公司及其软件的利益。然而安全测试的道路并不好走,需要更加系统和专业的技术来支撑,接下来的工作中,会将安全测试融入到测试环节中,并有序的开展安全测试工作。
推荐阅读Deco 智能代码体验版正式上线啦,快来体验设计稿一键生成代码~
Dubbo负载均衡策略之 一致性哈希领域建模之数据模型设计方法论四层负载均衡的NAT模型与DR模型推导