最近部门整理了今年所有项目测试团队提出的BUG,筛选了几十个作为常规通用的缺陷,我根据这些缺陷内容,去掉和业务相关的知识,整理出了一份缺陷描述和解决方案。

其实WEB系统中常规的缺陷分类后也就那么多,但汇总过程,有同事建议分类写得更通用点,但我想了下,写了后大家可能更看不懂,本来常犯的错误也就这么多,分类比如按照安全问题,性能问题,并发问题,可能描述更专业,但开发、测试团队的人看到可能太官方和自己无关,自己也不会引起重视了。所以我的分类和问题描述可能更口水话一点,但应该能让每个人都很快看得懂。

下面写下我整理的一部分,重要程度和犯错频率不分先后顺序:

一、不相信客户端的数据

缺陷描述:前台恶意伪造数据或页面的某些值未加载完成,用户发起一个请求但用了加载中的值,或请求的值本身就是恶意伪造的,导致后台抛出详细异常或导致sql注入,XSS等。

建议:不管前台数据是恶意伪造还是由于网速慢页面值未加载完成,但用户用该不“常规”数据请求,后台都应该一一校验,比如JS前段验证只是为了一定程度减少后后请求压力,后台代码应该再次校验客户端的任何数据,SQL参数应该参数化等。

二、页面未设置友好错误

缺陷描述:页面由于未对500,404等HTTP错误设置友好页面,导致前台抛出了细节的错误情况

建议:配置500,404等HTTP错误友好页面

三、ajax加载完成前后对页面事件的控制

缺陷描述:ajax请求前后对页面的其他新请求未进行限制,导致前一个ajax未处理完成,后续又在执行依赖前一个ajax返回数据的请求

建议:如果前台页面存在依赖关系的新请求(包括ajax),应在新请求时判断前一个请求是否完成,如果未完成,则等待或提示。

一个重要的ajax请求前应该设置某些按钮不可用,ajax请求完成后再把按钮设置为可用。这样该重要ajax请求完毕后才能点击其他操作

四、后台平行、垂直权限验证

缺陷描述:后台未对该请求判断该用户是否有权限操作本请求的数据,而只是判断了是否有权限操作这个链接或根本没有判断是否有权限操作该链接,该问题常会导致查看所有人订单或查看管理员数据

建议:权限控制除了控制当前用户权限是否有权限操作本请求地址,还需要判断是否有权限操作这条数据

五、一笔订单多次退款四舍五入问题

缺陷描述:单独作为一项,原因是支付退款是非常重要的环节。任何涉及支付退款的都可能有该问题。一个订单分多次退款,由于四舍五入的问题,会导致全部退款加起来会大于支付价格,比如大于0.01元

比如99.5元的订单,四舍五入精确到分,第一次退款33.17元,第二次退款33.17元,第三次退款33.17元,总退款:99.51元。

建议:我认为有两种解决方案:

1、支付按照四舍五入取大计算,退款按照取小计算,比如0.009元也算0.00元。这样不管分多少次退款,极端情况下,可能全部退完了,还会剩余0.02元更多点,适合极端情况一个订单分多次把所有费用退完,但供应商或平台最后可能还赚几分钱。但这个和业务有关系,需要确认。
2、退款每次按照四舍五入退款,但如果一个订单最后一笔退款则不再按照四舍五入退款,而是把支付金额减去已完成的所有退款金额,剩余的钱作为最后一次全部退,这样保证用户和供应商或平台都不会多退或多收的情况。

六、第三方框架问题

缺陷描述:第三方框架不熟悉或自身问题,导致安全或性能或其他问题

建议:普遍性问题,这个尽量保证用新版本的第三方框架,或在测试环境多测试后再上线,随时关注第三方框架的官方网站

七、浏览器后退问题

缺陷描述:该问题单独作为一类,是因为WEB系统非常典型的问题,浏览器后退导致订单可以再次退款,再次新增..数据之类的问题

建议:两个层面导致的问题,第一个是前台页面缓存,第二个是后台没有对重复数据做判断。解决思路:
1、对重要操作的页面设置禁止客户端缓存,这样浏览器不能后退或后退的页面已过期。
2、即使浏览器可后退,或通过请求回放手工制造请求等恶意重复提交,后台也应该判断,尤其是修改某操作,比如订单退款,导致一个订单退款多次;新增操作根据实际情况做判断,比如新增订单再后台再新增订单。后台对任何请求不管是重复提交还是新提交,都应该校验是否可以执行该操作。

八、服务端并发验证问题

缺陷描述:并发问题是任何系统需要考虑的问题,也是可能导致系统存在逻辑错误的地方

建议:重要业务修改,需要保证业务逻辑层面的事务,如果涉及多台后端应用服务器就更复杂了。比如单机用锁代码块能保证单机不出问题,但随机多机请求又可能出现问题,比如恶意用户用一个联通网络和电信网络同时对一个订单退款,如果单机锁代码块,可能导致联通网络请求A服务器,电信网络请求B服务器,A,B都成功导致退款2次。除了单机锁解决,可解决的思路:
1、重要修改业务,并行操作依赖一个单独的服务器或服务,该服务判断是否有第一次操作并加标记,另外一个请求再通过该服务器或服务判断是否可以继续操作,因此锁操作只需要在该服务器或服务严格判断锁即可,不会导致并发问题。但成本相对较高。
2、如果业务都是操作同一个数据库,那对数据库表增加一个状态字段,比如正在修改状态,多个事务同时请求,第一个请求修改该字段并where该字段为前一个状态字段,第二个请求修改该字段同样执行该sql。但第二个sql修改返回条数为0,因为被第一个sql修改成功了,where前一个状态不成立,所以范围影响行数为0。因此第二个事务请求就可以返回:有其他请求正在修改该订单,不能同时修改。这个解决思路成本较低。
上面主要说修改业务,如果新增业务,那多并发可以不很细致处理,因为可以把它当成不同时间段的多次请求新增数据,根据业务需求再做处理。

九、临界判断问题

缺陷描述:如果字符串split或indexof或判断数组长度等,经常导致遗漏最后一个或第一个数据

建议:首先字符串或数据集合第一个或最后一个数据需要先清理数据,比如1,2,3,最后一个,需要清理,清理完数据后再处理。处理数据也需要注意比如Length,size()的大小和数组对象从0开始计算的关系等问题。

十、对象批量update问题

缺陷描述:这个问题是后台代码的问题,有时候表数据太大,为了省事,直接update(表),但表里实际有的是敏感信息,比如密码,手机号,身份证等,这些数据之前是做了特殊处理的,比如有*号等,批量更新后可能导致字段被空字符串替换,或覆盖为明文了。

建议:尽量不批量update对象,update什么字段修改什么

十一、业务理解和处理问题

缺陷描述:由于对业务理解或沟通不清楚导致前段展现或业务逻辑不准确的问题

建议:重要业务逻辑需要多沟通确认,上线前多测试复杂业务逻辑。对业务逻辑不确定的地方,要用白名单,比如在什么情况才怎么处理,而不是黑名单或没有名单,直接就处理了

十二、JS兼容问题

缺陷描述:JS兼容问题是WEB开发最常遇到的问题

建议:根据业务要求是否兼容什么浏览器,上线前针对浏览器做测试,或比如现在阿里有浏览器兼容性自动化测试工具,可以业务测试完成后自动化测试JS和CSS兼容性问题。

十三、浮点数计算问题

缺陷描述:后台代码计算数据最经常遇到的问题

建议:浮点数计算数据会有精度问题,JAVA里float,double计算改为bigdecimal计算

十四、数据库不规整数据导致前台异常

缺陷描述:尤其在测试环境或老项目里,数据库里有字段不规整,导致前台异常或展现错误

建议:保证数据插入时数据就是按照要求放入数据库,数据展现也有容错机制,如果数据字段不正确就用默认数据或留空,保证页面能正常请求和返回

十五、内存缓存对象设计问题

缺陷描述:做系统经常会用内存缓存数据,内存缓存什么对象可能影响后续的业务逻辑

建议:页面缓存数据应该尽量精细,比系统为了限制同一个用户同时退款,可能在内存缓存了这个用户是否在退款和以及退款金额,但内存没有记录这个用户的什么订单在退款,导致其他订单这个期间也不能退款了。
内存缓存对象也需要建模,让内存对象字段尽量细化,保证满足各种应用场景。

上面15个是我根据2015年部门测试团队BUG情况,整理的一些通性和业务无关的缺陷描述和建议,肯定不全,而且这些问题的建议也可能不准确,仅限参考,如转载,请注明来自:http://lawson.cnblogs.com。

B/S系统常见缺陷整理和解决方案的更多相关文章

  1. Web系统常见安全漏洞及解决方案-SQL盲注

    关于web安全测试,目前主要有以下几种攻击方法: 1.XSS 2.SQL注入 3.跨目录访问 4.缓冲区溢出 5.cookies修改 6.Htth方法篡改(包括隐藏字段修改和参数修改) 7.CSRF ...

  2. 工作整理: python报表系统常见错误整理

    1.一般收不到邮件是因为配置文件邮箱写错 2.如果报表数据不对,看数据插入的时候是否再次写入产生冲突 3.如果收不到报表某些组别的excel查看组别名称是否匹配正确,是否匹配成功,不成功无法发送

  3. Windows XP与Windows 7系统常见漏洞

    1.Windows XP系统常见漏洞 Windows XP系统常见的漏洞有UPNP服务漏洞.升级程序漏洞.帮助和支持中心漏洞.压缩文件夹漏洞.服务拒绝漏洞.Windows Media Player漏洞 ...

  4. NDK(22)JNI编程如何避免常见缺陷

    转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html 避免常见缺陷 假设您编写了一些新 JNI 代码,或者继承了别处的某些 J ...

  5. 第九章、文件与文件系统的压缩与打包 Linux 系统常见的压缩命令

    Linux 系统常见的压缩命令: 在Linux中,压缩文件的扩展名大多是:『*.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2』 Linux 支持的压缩命令非常多,且不同 ...

  6. 程序缩小到托盘后系统就无法关机(解决方案)——处理WM_QUERYENDSESSION消息,并把它标识为处理过了

    程序缩小到托盘后系统就无法关机(解决方案)                       老帅    程序最小化到托盘后,会出现系统无法关闭的问题,常见于WinXP系统中,这里提供一个解决方案!一.解决 ...

  7. 针对不同手机系统的LBS地图定位解决方案

    原文:针对不同手机系统的LBS地图定位解决方案 摘要: 针对目前的三种手机系统:Android安卓.S60塞班.IOS苹果,做出的三种不同的手机地图应用解决方案. 查阅了多数地图API对手机的支持情况 ...

  8. flume常见异常汇总以及解决方案

    flume常见异常汇总以及解决方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际生产环境中,我用flume将kafka的数据定期的往hdfs集群中上传数据,也遇到过一系列的坑 ...

  9. Linux系统常见内核问题修复(转发)

    Linux系统常见内核问题修复(转发) 常见Linux系统破坏修复 http://blog.csdn.net/jmilk/article/details/49619587

随机推荐

  1. Swift—调用系统相册和相机

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  2. 机器学习——Logistic回归

    1.基于Logistic回归和Sigmoid函数的分类 2.基于最优化方法的最佳回归系数确定 2.1 梯度上升法 参考:机器学习--梯度下降算法 2.2 训练算法:使用梯度上升找到最佳参数 Logis ...

  3. Eclipse启动Tomcat时server.xml和content.xml自动还原问题

    当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为 ...

  4. MySQL的if,case语句使用总结

    原文地址: http://outofmemory.cn/code-snippet/1149/MySQL-if-case-statement-usage-summary

  5. ump_player在线直播播放器

      ump_player在线直播播放器封装,可以支持加载在线直播流 https://github.com/Mrxdh/EveryExercise/blob/master/ump_player%E5%9 ...

  6. Javascript操作DOM常用API总结

    基本概念 在讲解操作DOM的api之前,首先我们来复习一下一些基本概念,这些概念是掌握api的关键,必须理解它们. Node类型 DOM1级定义了一个Node接口,该接口由DOM中所有节点类型实现.这 ...

  7. 【IOS】模仿"抽屉新热榜"动态启动页YFSplashScreen

    IOS最好要设置系统默认启动页面,不然进入应用就会突然闪现黑色画面 下图是我们要实现的效果: 总体思路:设置一个系统默认启动页面,在进入didFinishLaunchingWithOptions时, ...

  8. MAC OS升级到10.11(OS X EICAPTION)之后CocoaPods不能正常使用的问题解决

    昨晚回家之后开始升级系统到10.11,下载了一整个晚上之后终于在早上下载完毕,早上带到公司,想查一个第三方库的时候却遇到了问题: guoyufudeMacBook-Pro:~ GuoYufu$ pod ...

  9. juqery 正则表达式的使用

    juqery 正则表达式的使用test() 方法用于检测一个字符串是否匹配某个模式.js原生的方法 reg="/^13[0-9]{1}[0-9]{8}$|15[0-9]{1}[0-9]{8} ...

  10. 如何在ARM中创建Express Route

    很早之前就想试试Azure的express route,但是一直没有找到合适的机会,正好有个客户需要上express route,所以最近先自己研究研究,防止在做poc的时候耗费更多时间,本次场景我们 ...