做一个快乐、自由的公主!

发布新日志

  • 转:关于测试人员的职业发展

    2015-03-18 15:15:10

    近期由于项目组人手不够,需要招聘一些测试人员。本周及上周陆陆续续面试了十多个应征者,工作年限在2年~9年之间,但无一满意。期间,种种感叹,回想起去年面试六十余人仅有3人满足要求,如有鲠在喉,还是吐槽一下。如有不对请大家也狂喷我。

          我的要求高么?

          我的要求其实是:有还算不错的沟通能力,熟悉常见软件开发流程,有一定的需求分析、用例设计能力,会基本的linux和sql操作能力。有一些代码能力会加分。这是长期与现实妥协的结果。如果人还算机灵,其实我很愿意花时间来培养他们。

          面试结果

          令人惋惜的是,一个合适的人真的很难找。更令人惋惜的是,我看到好多入行很多年的同行,能力并没有跟随工作年限一同增长,有些做了五六年的人有时候给人感觉竟然还不如一个入行一两年的年轻人。最令人遗憾的是,大部分同学竟然没有一个明确的职业发展思路,即使有,也没有经过深入一些的思考,而是人云亦云。

          面试的一些细节:  

          因为从事的工作是业务密集型的,有的业务逻辑非常复杂,我们特意准备了一份不错的需求(考虑到应试者没有行业背景,给出了详尽的专业说明和例子),并根据这份需求出了几道用例设计的题。只有不到四分之一的应试者给出了让人相对满意的答案。我们内部评估这份需求的时候,认为只要有过一两年的用例设计经验,应该能答的不错。

          我一般会根据简历问一些问题,看看简历的真实性。也会问一些基础的测试知识,查看应试者的专业素质。

         常见的问题:

         说说你常用的测试方法? 百分之九十的人只能答出等价类和边界值。只有少数人可以讲出其它测试用例设计方法,但深入问,从没有一个人能有令人满意的回答.

         给一个非常简单的小例子,例如登录操作,让应试者回答如何使用等价类方法设计用例。但让人吃惊的是仍然只有不到五分之一能够给出比较满意的答案。

         陈述一个缺陷的生命周期(你们是怎么管理bug的?)有一多半人能够说出常见流程,但深入问一些问题:如缺陷如何同版本、测试轮次等结合起来,一些特殊情况如何处理等,很多人就懵了,而这些基本上都是工作中常用的。

         你做的最长的一个项目是什么?在这期间你遇到了什么问题让你最头疼?你如何解决它?十个人里大约只有一人能给出还算不错的答案(能够识别出问题,提出它带来 的不利影响是什么,并能够给出一定的解决方案就算是不错的答案了)。

         你感兴趣的测试工作是什么,你想在哪方面有所发展?十个人里有4个会说是自动化测试,3个会说性能测试,2个会说是管理,一个会说是白盒测试。并希望提供相应培训。只有极少数人能够说出具体的思路和技术项。

         如果继续追问:你说的是性能测试吧?你有过这方面的学习么?一半会说看过一些网站上的技术文章,一半会说看过loadrunner的书。如果继续追问,是哪本书?是哪类文章?有哪些具体的知识点能讲一下么?90%答不上来。

         问:你有看过哪一本测试书籍?哪些技术博客?哪些网站?50%的人会说看过QTP的书(QTP的真正使用率已经快赶上诺基亚的使用率了,国内主流自动化的书竟然还是这个!),并且没有真正在工作中使用过,然后就没有别的了。有少一半人最近几年一本技术书籍也没有看过。

         如果有管理经验的应试者,我会问一些测试过程管理相关的问题,如给一个最简单的题:如果测试时间不够如何?十个人中只会有两三个提到排定优先级和测试裁剪,大部分人的回答竟然是加班也一定要搞完。

        我想说的:

     1.为了你的前途,请多明确一些个人能力思路吧。你五年后,十年后是个什么样子?有没有一个明确的想法?有没有你五年后想达到的某个人的程度?如果这些思路不清楚,请多看看外面的世界,看看一些测试做得非常好的人是如何工作的,他们掌握了什么能力?学习他们,追赶他们并尝试超越他们。最好认识他们,可以侃侃大山,志同道合抱团前进很好。另外目标别定太抽象,一定要是可以分解,可以检查的。

      2.多读一些测试书籍,测试的书并不是只有QTP!看看微软测试专家史亮推荐的书单,这些都是不错的好书:http://www.cnblogs.com/liangshi/archive/2011/03/07/1973525.html  有些书能够帮助你把测试知识框架搭建起来,比照一下你还缺点啥? 

      3.多读一些其它书籍,不限于技术书籍。如果想读的书有利于工作,推荐一些如何做思辨思维的书。《思考的艺术》《六顶思考帽》《你的灯亮着么》 《学会提问》是我喜欢的4本书。它们会教你怎么独立思考,养成提问的习惯,而提问的习惯是我们现在的测试人员最缺乏的一件事情。人们往往拿了被测物就开始忙着写用例,忙着测试。而不是先探索它、研究它。当然IT技术也要掌握,如果你的IT技能能够赶上开发,你发现你做测试的思路会非常的宽广:)

     4.把书籍中的东西跟你的工作对比,把好的东西引入工作(这点是检验书本质量的好方法,也是促进你思考,促进你能力提高的好方法。

    5.关注大牛们的技术博客。国内写好测试博客的人不是很多(很多人其实很有水平,但是不喜欢写blog),但是国外有很多,有人整理了一个list也推荐给大家:http://ssnlove2008.blog.163.com/blog/static/3788942020093284842381/。

    6.搞定你所在行业的领域知识:如常见IT技术,常见业务知识,这些知识掌握的越深,你的价值越高。测试技术是内功,但是你能直接为企业带来价值的最大之处是你对被测物熟悉程度,也就是你的领域知识!!!

    7.没有方向?从你的工作入手,比如,你遇到的最大的难题是什么?我怎么解决它?我需要掌握什么样的技术解决他?我要推动什么样的组织改变来解决它?别人怎么解决它?有没有更好的方法?使用后我改进了那些?google一下别人有没有同样的问题?尝试作对比,如果觉得他做得好,尝试联系那个人讨论一下。看看对方的进展。尝试把活儿干得特别漂亮。你能解决10个中等问题以后,你的能力会有大幅度提高。 

    8.尝试做笔记。最好是在线的,推荐印象笔记和有道云笔记。

    9.坚持。

    10.保证身体健康,岁月会给你带来别人的信任感(当然能力要随着岁数增长)。

    能做到这里面的一半,两年后你就能在专业上有高分通过我的面试:)当然肯定你也不见得会看得上我们的offer了。

    11.对于没想好就跳槽,换行业的同学说:你再想想!你的很大价值是与你企业、行业绑定的。如:做了5年保险业务,你的领域知识至少值5w每年,换领域就没了。你在一家公司证明了你自己,到新公司要重新证明你一遍,有的时候外部环境、机遇等会让证明过程很痛苦,成本很高。

    另外的吐槽:

    野蛮生长没有经过系统训练的同学非常多。这其实有很多因素,分析起来觉得有以下几点:

    1.大学或者职业教育没有非常好的课程体系(有些培训机构还行,但是也需要提高),其实测试技能需要系统训练和长时间磨练才能有根本的增长,我们的职业教育或者再教育体系其实还是有很大空白的。

    2.说句实话,大家的读书氛围不够浓厚。大家不喜欢看书。而读书是再教育成本最低,又非常有效的途径。相比于程序员,测试同学喜欢读技术书籍的比率明显的低,这是一个让人悲伤的事实。真希望这种现象能够改变。

    3.很多人是不喜欢coding才转测试,或者是因为IT产业普遍薪水高才来做测试。不是真正热爱这份工作,不热爱其实做不好,因为兴趣是最好的老师。

    4.很多人认为测试门槛低,young talent 不愿意干,测试吸引人才有点儿困难(我初入行的时候也有这种想法,也是当时被强拉来做测试的,当时想做的是coding和数据DBA相关工作并已经有了一些积累,(我没说我是啥人才啊))。说实话测试的入门门槛的确有一点点低,但是做好测试的门槛确是相当的高,随着系统越来越复杂,测试逐渐会比开发还难做,更有挑战性,我这么说你信么?

    5.专业化社区还没有形成规模,测试人员没有能有效交流的平台。这是跟美国和欧洲的一个挺大的差距。他们的社区做得挺好的,我们也有了一些很好的起步。如一些热衷测试公益的同学,一些不错的会议,一些不错的线下活动,但还需要大大的发扬光大。

     

    真心希望测试行业的整体水平能够逐渐提高起来。

    最后看一下测试大牛James Whittaker(Google测试之道 和 探索式软件测试 的作者)对职业路程发展的一篇文章吧,你会受益很多:

    http://www.cnblogs.com/skytraveler/p/3546703.html

  • 转:为什么要搭建自动化测试框架?

    2015-03-16 15:05:20

    http://www.51testing.com/html/74/n-1810174.html
  • 转:为什么要搭建自动化测试框架?

    2015-03-16 15:04:24

    和一般的软件项目一样,自动化测试框架的开发是由自动化测试需求决定的,这个需求包括:
      一、自动化测试更便于实施
      二、处理自动化测试脚本本身的存在的问题,如异常处理和场景恢复
      三、弥补测试脚本本身的不足或是特殊测试需求
      四、测试易于维护
      自动化测试过程包括三个要素:输入、输出、预期结果与实际结果的比较。
      输入包括测试数据和测试步骤两部分。测试数据可以直接与测试步骤一起直接写在脚本里,也可以独立于代码,通过配置文件或参数的方式传递到测试中。测试步骤是测试脚本的主体,它依赖于软件的行为。软件输入的随意性使软件行为难以确定,这大大提高了编写测试脚本的难度。软件本身存在的缺陷或系统响应时间等问题都可能导致测试脚本执行失败。我们测试中无法考虑到脚本执行过程中所有的异常情况,而这会导致测试脚本执行的不稳定性,因此我们需要针对测试脚本本身做异常处理。
      输出,并将其与预期结果比较是自动话测试的另一个重点;相对于输入对软件的依赖,这个过程则是偏向于计算和比较,需要较高的编码能力。在测试项目中,测试结果的获取经常不像手工测试那么容易,而且验证规则比较复杂,有时一个校验点需要数十行甚至几百行代码才能完成。在自动化测试中,很多功能函数是通用的,且对于同一个项目,经常需要重复做这相同的事情。这样,设计一些公共函数对整个脚本的开发工作和维护工作是大有裨益的,不仅可以大大减少编码量,而且可以提高脚本的正确性和可维护性。
      因此我们可以通过测试框架为我们做以下事情:
      第一、处理脚本中一些异常和错误处理工作;
      第二、实现一些通用的功能,简化脚本开发的过程;
      然而对于自动化测试,我们不能一个脚本一个脚本的去执行测试,而希望能够自如的部署测试,比如我们选择要执行的用例后,自动化测试框架能够执行相应的用例并给出测试结果。
      基于此,我们希望测试框架可以帮我们实现:
      第三、根据需求驱动测试执行;
      第四、测试场景恢复;
      第五、测试结果输出。
      当然,我们的需求可能还不止这些,需要测试框架为我们做更多的事情。
  • 基础功能测试的一些实质建议

    2011-09-09 13:45:49

    http://www.51testing.com/html/88/n-245188.html
  • 转:Android上的Webkit的测试

    2010-11-29 16:06:38

    啥叫webkit:

      WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。

      传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过,随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用V8引擎,却仍然宣称自己是WebKit内核)。

      目前常见的采用webkit的浏览器有:  Chromium · Google Chrome · 傲游 3 · Epiphany · iCab · Midori · OmniWeb · Safari  · Shiira, iphone, android, Symbian S60

      测试的时候选定一个或两个参照对象,不妨选择Chrome这个新生事物,确实是个不错的浏览器。

      Webkit的特性:

      Css1, Css2.1的支持(测试网页http://www.w3.org/Style/CSS/Test/#CSS2.1),CSS3 Selectors的支持,SVG,MathML,CSS,DOM

      浏览器的标准测试:

      引入浏览器的标准测试,大致包含以下几类:

      网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由W3C起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。

      1.结构标准语言

      (1)XML

      XML是The Extensible Markup Language(可扩展标识语言)的简写。目前推荐遵循的是W3C于2000年10月6日发布的XML1.0,参考(www.w3.org/TR/2000/REC-XML-20001006)。和HTML一样,XML同样来源于SGML,但XML是一种能定义其他语言的语。XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。

      (2)XHTML

      XHTML是The Extensible HyperText Markup Language可扩展标识语言的缩写。目前推荐遵循的是W3C于2000年1月26日推荐XML1.0(参考http://www.w3.org/TR/xhtml1)。 XML虽然数据转换能力强大,完全可以替代HTML,但面对成千上万已有的站点,直接采用XML还为时过早。因此,我们在 HTML4.0的基础上,用XML的规则对其进行扩展,得到了XHTML。简单的说,建立XHTML的目的就是实现HTML向XML的过渡。

      2. 表现标准语言

      CSS是Cascading Style. Sheets层叠样式表的缩写。目前推荐遵循的是W3C于1998年5月12日推荐CSS2(参考http://www.w3.org/TR/CSS2/)。W3C创建CSS标准的目的是以CSS取代HTML表格式布局、帧和其他表现的语言。纯CSS布局与结构式XHTML相结合能帮助设计师分离外观与结构,使站点的访问及维护更加容易。
    3.行为标准

      (1)DOM

      DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范(http://www.w3.org/DOM/),DOM 是一种与浏览器,平台,语言的接口,使得你可以访问页面其他的标准组件。简单理解,DOM解决了Netscaped的Javascript和 Microsoft的Jscript之间的冲突,给予web设计师和开发者一个标准的方法,让他们来访问他们站点中的数据、脚本和表现层对像。

      (2)ECMAScript

      ECMAScript是ECMA(European Computer Manufacturers Association)制定的标准脚本语言(JAVAScript)。目前推荐遵循的是ECMAScript. 262(http://www.ecma.ch/ecma1/STAND/ECMA-262.HTM)。

      W3C网页的标准测试

      页面校验地址 http://validator.w3.org/

      CSS文档校验 http://jigsaw.w3.org/css-validator/

      XHTML 1.0 标准规格 : The Extensible HyperText Markup Language

      W3C标准测试网址 http://validator.w3.org/

      测试时一定要有文件类别宣告还有指定文件编码

      <meta. http-equiv="Content-Type" content="text/html; charset=gb2312" />

      才能顺利进行测试动作,开始打造一个万维标准的网站吧!

      -W3C Markup Validation    网址: http://validator.w3.org/

      -W3C CSS Validation        网址:http://jigsaw.w3.org/css-validator/

      -W3C mobileOK Checker    网址:http://validator.w3.org/mobile/

      -W3C Link Checker         网址:http://validator.w3.org/checklink

      -W3C Feed Validation Service 网址:http://validator.w3.org/feed/

      浏览器的标准测试链接:

      CSS测试:http://www.w3.org/Style/CSS/Test/(CSS2.1的测试页面:http://www.w3.org/Style/CSS/Test/CSS2.1/current/)

      ACID3测试: http://acid3.acidtests.org/  各浏览器的测试结果(http://www.anomalousanomaly.com/2008/03/06/acid-3/)

      Acid2测试:http://acid2.acidtests.org/

      各种ACID测试可以到http://www.acidtests.org/上面测试

      可以参考IE8的测试中心网站:http://samples.msdn.microsoft.com/ietestcenter/ ,当然IE不是很全了

  • 转:性能测试人员面试经典技术问题

    2010-09-01 15:25:20

    1.请问什么是性能测试、负载测试、压力测试

      性能测试:对一个软件系统而言,包括执行效率、资源占用、系统稳定性、安全性兼容性、可扩展性等。

      负载测试:通过逐步加压的方式来确定系统的处理能力,确定系统能承受的各项阀值。

      压力测试:逐步增加负载,使系统某些资源达到饱和甚至失效的测试。

      2.请分别针对性能测试、负载测试和压力测试试举一个简单的例子?

      性能测试例子:公司开发了一个小型项目管理系统,上线前需要做负载、压力、大数据量、强度测试等。

      负载测试:逐步加压,从而得到“响应时间不超过10秒”,“服务器平均CPU利用率低于85%”等指标阀值。

      压力测试:逐步加压,从而使“响应时间超过10秒”,“服务器平均CPU利用率高于90%”等指标来确定系统能承受的最大负载量。

      3.请例举出常用的性能测试工具,并指出这些工具的优缺点?

      LoadRunner,录制脚本快捷操作简便,需要一定的学习时间,有采购成本。

      4.请问您是如何得到性能测试需求?怎样针对需求设计、分析是否达到需求?

      在查看需求文档,从中提取性能测试需求,与用户交流,了解实际使用情况。

      结合业务信息设计操作场景总结出需测试的性能关键指标。

      执行用例后根据提取关键性能指标来分析是否满足性能需求。

      5.什么时候可以开始执行性能测试?

      在产品相对比较稳定,功能测试结束后。灵活性比较强。

      6.什么是集合点?设置集合点有什么意义?LoadRunner中设置集合点的函数是哪个?

      集合点可以控制各个Vuser以便在同一时刻执行任务。

      借助集合点,可以再LoadRunner中实现真正意义上的并发。

      lr_rendezvous()

      7.性能测试时,是不是必须进行参数化?为什么要创建参数?LoadRunner中如何创建参数?

      8是。

      模拟用户真实的业务操作。

      创建参数列表,用参数替换固定的文本。

      8.您了解关联吗?如何找出哪里需要关联?请给一些您所在项目的实例。

      了解。

      使用LoadRunner自动关联功能。手动关联:录制两份相同操作步骤的脚本,找出不同的部分进行判断。

      一个项目管理系统,每次登录后服务器都自动分配一个sessionID以便之后每次表单提交后验证。

      9.您如何调试LoadRunner脚本?

      设置断点、增加log。

    10.在LoadRunner中如何编写自定义函数?请给出一个您在以前项目中编写的函数。

      11.请问您是如何理解LoadRunner中集合点、事务以及检查点等概念?

      集合点:可以控制各个Vuser以便在同一时刻执行任务,可实现真正意义上的并发。

      事务:事务是用来度量服务器响应时间的操作集。

      检查点:在回放脚本期间搜索特定内容,从而验证服务器响应内容的正确性。

      12.如何应用LoadRunner进行性能测试?

      使用虚拟用户生成器创建脚本,使用控制器设定场景、运行脚本,使用分析器分析运行后得到的数据。

      13.LoadRunner中思考时间有什么作用?

      用户执行两个连续操作期间等待的时间。模拟用户真实的使用情况。

      14.LoadRunner中如何实现多用户并发操作,需要进行哪些设置?

      设置集合点来实现,在脚本中加入lr_rendezvous(),然后可以在控制器中设定集结百分比。

      15.LoadRunner中有基于目标和手动两种场景设计方式,他们分别适用于什么情况?

      手动场景可按照要求来配置场景,能够更加精确的满足测试需要。

      目标场景要先制定希望实现的测试目标,然后由控制器惊醒自动测试评估。

      16.LoadRunner中有几种并发执行策略,它们的含义是什么?

      三种。1.当所有虚拟用户中的x%到达集合点时释放。2.当所有正在运行的虚拟用户中的x%到达集合点时释放。3.当x个虚拟用户到达集合点时释放。

      17.有5台配置为处理器:Intel Pentium 4 1.6G,内存容量 512MB,硬盘容量 40GB的机器,如何较好的利用这些机器完成一次并发用户数为1000人的性能测试工作?

      1台做应用服务器,1台做数据库服务器,1台运行控制器并承担一部分负载生成任务,2台负载生成器。

      18.平时大家在注册邮箱等关联操作时,经常会遇到需要输入验证码的情况,请问,如果我们公司也开发了一套带验证码的应用软件,需要警醒性能测试,您会如何处理?

      留一个后门,我们设定一个所谓的“万能验证码”,只要用户输入这个“万能验证码”,系统就验证通过。测试完成后补上后门。

  • 转:在你的代码中寻找安全缺陷的专家技巧

    2010-01-21 17:32:20

    摘要
      因为安全缺陷而复审代码是软件制作过程中的一个关键部分,贯穿于计划编制、设计和测试。本文是作者反省其多年来的代码安全复审工作而总结出的所有开发人员在追踪潜在安全漏洞时可以遵循的一些识别模式和准则。该过程开始于检查代码的运行环境,考虑到将要运行代码的用户的角色,并研究该代码可能存在安全问题的历史。在对这些 背景问题有一个了解之后,特定弱点就可以被找到,包括SQL注入攻击,跨站点脚本,和缓冲区溢出。另外,某些危险信号,例如象 "password"、 "secret" 之类的变量名以及其它一些明显而普遍的安全失误都可以被查出并纠正。
      我的大部分工作涉及到复审别人的代码,寻找安全方面的错误。诚然,这并不是我的首要任务——往往是设计复审和威胁模型分析[编者:threat modeling 即威胁模型分析]—但是我确实要看到大量的代码。
      但愿你能理解对别人代码的复审工作,虽然是做了件好事,它确不是创造一个安全的软件的方法 。 你要通过设计、编写、测试并证明安全系统的过程,并通过在进度表中考虑安全复审、培训和使用工具所用的时间来产生安全的软件。只简单地设计、编写、测试和 编制项目文档,然后再寻找安全错误并不能创造出安全的软件。代码复审仅仅只是这个过程的一部分,但是它本身并不能创造出安全代码。
      在本文中我将不会讨论代码弱点的本性,比如整数溢出攻击、SQL注入和缓冲区溢出;你可以在一些书本中进一步了解这些问题(比如我的书 《Writing Secure Code》,Microsoft Press®,2002)。而是采用在一个高层次的观点来考虑复审代码过程中的问题。然而,在开始之前我想指出的是这仅仅是我复审代码 查找安全错误的方法;它不一定是你应该使用的复审代码方法,我也不能保证它的形式完全适合于某些特定种类的漏洞。我想证明的是我在看代码时脑中想到的同样对你 也的确是有帮助的。
      在我看来,复审代码有三种方法:详细分析,快速分析和混合方法。我倾向于采用混合方法,因为它有迅速覆盖很大范围的优点;如果我觉得某些东西需要更 深入的分析我会将它标出来以便将来进行代码复审,可能涉及到其他专家关注的领域。但是现在,我只讨论最初的快速代码复审,正如我喜欢这样称呼它,这种扫描''n''标记方法—迅速地扫描代码,并标出需要进一步复审的代码。 下面是我实现这个过程的要点。
    分配时间和努力

      我有一套等级评定体系,我用它来确定复审代码所需的相对时间。这个体系基于如果弱点被利用后存在的潜在危害以及可能受到的潜在攻击。 具体针对的范围基于以下几个特点:
    代码以缺省值运行吗?
    代码以高优先级运行吗?
    代码是否侦听某个网络接口?
    网络接口是不可靠的吗?
    代码是用C/C++写的吗?
    该代码以前是否有历史弱点?
    该组件是否由安全研究员做过最终详细审查?
    该代码处理敏感或隐私数据吗?
    代码是可复用的吗(例如,某个 DLL、C++ 类头文件、库、或程序集)?
    根据威胁模型分析,该组件处于高风险环境或遭受高风险威胁吗?
      如果该列表中同时有三或四个以上项目被言中,这时我将在更深的层次上复审代码。事实上,如果代码是侦听传输控制协议(TCP)或用户数据报协议(UDP)的 socket 并以缺省值运行,那么就要准备大量时间来复审该代码。
      在查找安全错误时,我倾向于复审三个主要类别的代码:C/C++代码,网络服务器应用代码,(比如 ASP、ASP.NET、CGI、和 Perl) 以及托管代码(主要是C#,和一些 Visual Basic .NET)。
      你应该意识到每一种语言都存在一些细微的差别。首先,C 和 C++ 的首要问题是缓冲区溢出。诚然,还有一些其它问题,但是当你在同一个句子里听到单词“缓冲区”和“超限”时 ,你几乎可以确信这肯定涉及到了C 或 C++。更高级的语言如 C#、Visual Basic.NET 和 Perl 应该没有缓冲区溢出问题。如果有,那么这个缺陷可能出在运行时环境而非正在被复审的代码中。然而,这类语言常被用于 编写网络服务器应用软件代码,并遭遇其它类型的缺陷。缓冲区超限是令人讨厌的,因为攻击者可以将代码注入正在运行的进程中并取得控制权。所以让我们首先看看缓冲区溢出。
    C和C++的缓冲区溢出

      缓冲区超限是软件行业的祸根,你应该竭尽全力将它们从代码里清除出去。但是,最好是首先不要让它们进入代码。在我复审缓冲区超限的代码有两个办法。第一是识别出这个应用软件 的所有进入点,尤其是网络进入点,跟踪数据在代码中的移动并质问数据是如何被处理的。我假定所有数据都是畸形的。当看到接触(读出或写入)该数据的任何代码时,我 便问,“有没有导致该代码失败的数据版本?”。这种方法虽然彻底但非常耗时。另一个技术是寻找已知的和潜在的危险结构并跟踪数据回到进入点。 以下面的代码为例:


    void fuction(char *p) {
            char buff[16];
            …
            strcpy(buff,p);
            …
            }
      如果我看到像这样的代码,我将跟踪变量 p 到它的源头,并且如果它来源于某个我并不信任的地方,或在接近它被拷贝的地方没有进行合法性检查,这时我知道已经找到了一个安全缺陷。值得注意的是,并不是说 strcpy 本身是危险的或者说是不安全的。应该说,恰恰是这个数据使得这类函数惊慌失措。如果你检查的数据具有良好的格式,那么 strcpy 可能就是安全的。当然,如果你犯错,那么你的代码就有一个安全错误。我也检查“n”版本字符串处理函数,比如 strncpy,因为你也要检查那些缓冲区大小的计算是正确的。
      我谨慎对待那些处理标注文件格式的代码。通过标注那些由块组成的文件,这里每个块都有一个头描述下一个数据块。MIDI音乐格式就是一个很好的例子。一个严重的安全缺陷被发现后,在一个处理 MIDI 文件的名为 quartz.dll 的 Windows 组件中被修复。有个畸形的 MIDI 结构导致了处理文件的代码失败,或更糟。你可以在 Unchecked Buffer in DirectX Could Enable System Compromise 得到更多关于这个缺陷的内容。

    另一个我留心的结构是:
            while (*s != ''\\'')
            *d++ = *s++;  
    这个循环囿与源中的某个字符;它不受目的地大小的限制。我主要用下面的正则表达式扫描 *x++ = *y++。
            \*\w+\+\+\s?=\s?\*\w+\+\+       
      当然,人们也可能用 *++x = *++y,因此你也需要对此进行扫描。我想在这里再次强调的是这个结构并不危险,除非数据源是不可信的,因此你需要确定数据源是否可信赖。

    下面是另一类你应该注意的与缓冲区超限有关的问题:整数溢出弱点。
     

    C和C++的整数溢出

      真正的安全缺口发生 于计算某个缓冲区大小的算法以及计算导致的上溢或下溢。看下面的例子:

            void func(char *b1, size_t c1, char *b2, size_t c2)
     {
             const size_t MAX = 48;
             if (c1 + c2 > MAX) return;
             char *pBuff = new char[MAX];
             memcpy(pBuff,b1,c1);
             memcpy(pBuff+c1,b2,c2);

             }
      这段代码看起来挺好,但是,如果你将 c1 和 c2 相加并且结果超过 232-1。你便会认识到有问题,举个例子,0xFFFFFFF0 和 0x40 相加的结果是 0x30 (十进制数为 48)。当它们被用来做 c1 和 c2 的值时,这个加法通过了检查,此时这个代码将拷贝近 4GB 的内容到一个48字节的缓冲区。你正好遭遇到缓冲区超现!许多像这样的缺陷是可被人利用的,它允许攻击者将代码注入到你的进程中。
      当复审C 和 C++代码的整数溢出时,我查找所有 new 操作符以及动态内存分配函数(alloca, malloc, calloc, HeapAlloc等等)的实例,然后,我确定缓冲区大小是如何被计算的。接着我问自己如下几个问题:
    这些值是否会超过某些最大值吗?
    这些值是否会小于零?
    数据是否被截断(将32位值拷贝成16位值,然后拷贝 32 位大小)?
      这里有一个我在微软的同事常用的规则:如果你某个被用于比较的表达式中执行一个数学运算,此时你将有一个潜在的上溢和下溢数据。如果该计算被用于确定一个缓冲区 的大小,那么事情会变得加倍地糟糕,尤其是如果一个或更多的缓冲区大小的计算方法被攻击者利用时。
    任何语言中的数据库存取代码

      作为一般原则,数据库应用软件的开发者使用更高级的语言如C#,脚本语言和类似的语言。相对而言,很少有数据库代码是用 C 和 C++ 写的,但是一些人使用各种C/C++类库 ,如 MFC 中的CDatabase 类。
      这里可以发现两个问题:首先是包含硬编码口令或用管理员帐号进行连接的连接串。其次是SQL入侵攻击弱点。
      当我看托管代码时,首先我要做的是搜索整个代码中的 System.Data 名字空间,特别是 System.Data.SqlClient。当我看到这些,警种就在我耳边响起! 接着,我在代码中查找诸如“connect”这样的词(通常有一个连接串在附近)。连接串有两个令人有趣的属性要查找:连接 id(通常是 uid)和口令(通常是 pwd)。一些 象下面这样的东西就是潜在的安全漏洞:
    DRIVER={SQL Server};SERVER=hrserver;UID=sa;PWD=$esame
      实际上,这个例子中有两个缺陷。第一,该连接串由系统管理员帐户 sa 构成;它破坏了给予最小优先权原则。代码决不能用系统管理员帐 号连接到数据库,因为心怀不轨的人能用这样一个帐户对数据库造成严重破坏。第二,口令是硬编码。说它是错误有两个原因:首先,它能被发现; 其次,口令被更改了怎么办?(你将不得不更新所有客户端)
      下一个主题是SQL入侵攻击。SQL入侵的症结在于使用字符串连接生成 SQL 语句。当扫描代码时,我要看 SQL 语句在什么地方建立。一般来说,它涉及到寻找 下面 “update”,“select”,“insert”,“exec”以及我所知的任何表或数据库名称。为此,我使用 ildasm.exe 象下面这样反汇编托管程序集以便详细查看。

    ildasm /adv /metadata /out:file test.exe

      然后我 在输出结果中查看“用户串”部分。如果我发现任何使用串连接的数据库查询,这是一个潜在的安全缺陷,并且必须用参数化查询赖取代它以修复该缺陷。
      用字符串连接建立存储过程对SQL入侵也于事无补。总之,字符串连接加SQL语句是很槽的,但是字符串连接加SQL语句加系统管理员帐户加简直就是灾难。

    任何语言编写的 WEB 页面代码

      在基于 WEB 的应用程序中最为普通的错误是跨站点脚本(XSS)问题。虽然还有我要找的其它问题,比如 SQL 入侵和弱的加密系统,XSS 缺陷相当普遍。XSS 的核心弱点是可能将不可 信的用户输入显示在受害者的浏览器上,因此我首先要搜索任何发送数据到用户代码构成。举个例子,我在ASP中寻找 Response.Write 和 <%= %>标签。然后,我查看所写的数据来源于什么地方。如果数据来源于一个HTTP实体,比如一个表单或一个查询串,并且没有经过合法性检查就被送到用户的浏览器上。那么便存在一个 XSS 缺陷 。这里有一个非常简单但是并不常见的 XSS 例子:

    Hello,

    <% Response.Write(Request.QueryString("Name")) %>r>
    正如你所看到的,“Name”参数并没有首先经过合法性检查以及格式是否良好便被送回给用户。

     

    保密和任何语言编写的密码系统

      一些开发者有个癖好就是将密码数据存储在代码中,比如口令和密钥,并且创造他们自己的不可思议的加密算法。千万不要做这两件傻事!
      我首先查找包含“key” “password” “pwd”“secret” “cipher”和“crypt”的变量名和函数名,只要发现其中 任何一个便进行分析。你常常能获得“key”的假结论,但是其它的结果很有趣,可能产生出嵌入的密码数据,或者是那“不可思议的”加密系统。当搜索加密算法时,我也寻找异或 (XOR)操作,因为它们常被用于加密操作。最槽糕的代码就是那些使用一个嵌入密钥异或一个数据流!
    Visual Basic 和 C++ 中的 ActiveX 控件

      我在复审一个新的 ActiveX® 控件时总在问一个问题:为什么不能用托管代码来写它们?我之所以问这个问题是因为托管代码允许局部信任情 形,但是 ActiveX 不会。
      接着,我着眼于控件上的所有方法和属性(.IDL文件是最好的地方),并且我把自己放在一个坏家伙的角度。我能用这些方法和属性做些什么坏事呢?一般来说,一些方法用动词加名词的格式来命名,比如说ReadRegistry,WriteFile,GetUserName, 以及 NukeKey 之类,因此我寻找与敏感资源有关的动词和名词。
      举个例子,如果攻击者能获取任何在用户硬盘上的文件,并发送到任何位置,比如攻击者控制的网站。那么 SendFile 方法便有潜在的危险,任何访问用户机器上资源的事情都应受到进一步的详细审查。
      如果控件涉及脚本安全(SFS)问题,我会做额外的复查工作,因为它可能会在没有警示用户的情况下,在浏览器中在被调用。如果它实现了ATL IobjectSafetyImpl接口或在安装时设置了以下“脚本安全”或“激活安全”的执行范围,你便可以确定该控件是否是 SFS:

    [HKEY_CLASSES_ROOT\CLSID\\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
    [HKEY_CLASSES_ROOT\CLSID\\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
     前面我提及用 SendFile 方法访问和发送用户文件不是件好事。事实上,它是一个隐密的缺陷,即使我能存取 SendFile 方法并根据该方法返回 的出错代码确定某个文件存在于用户硬盘上。

    结束语

      这是我在复审代码时首先要考虑的重中之重。一些缺陷并不复杂,有人会说开发人员不应该犯这种错,但他们确实犯了。然而意识到为了安全而复审代码,通常会 促使你将编写更加安全的代码放在首位。
      你可能已经注意到某些缺陷类型的一个共同点,那就是大多数缺陷都是由于不可靠的输入所导致的。在复审代码时,你应该总是问这些数据从哪里来以及你是否相信它们。

  • 转:安全测试简介

    2010-01-21 17:30:28

  • 转:WEB UI自动化之旅

    2010-01-21 17:18:21

  • JIRA安装(windows)

    2009-07-06 17:21:11

    JIRA安装
    1、环境:Windows XP,tomcat5.0.28,mysql5.0.37,apache2.0.59,
    2、下载jira,http://downloads.atlassian.com/software/jira/downloads/atlassian-jira-enterprise-3.8-standalone.tar.gz
    3、解压到一个目录,jira的根目录用%JIRA_HOME%表示,atlassian-jira-enterprise-3.8-standalone自带了tomcat,如果已经设置过了CATALINA_HOME,更改%JIRA_HOME%\bin\startup.bat文件,找到::okHome,在其下增加:
    cd ..
    set CATALINA_HOME=%cd%
    这样更改后,运行%JIRA_HOME%\bin\startup.bat就能启动jira自带的tomcat,
    4、修改连接池配置(jira默认使用HSQLDB)修改%JIRA_HOME%\conf\server.xml,
    将该文件中的连接池配置更改为mysql的配置。如:

    1 username="root"
    2 password=""
    3 driverClassName="com.mysql.jdbc.Driver"
    4 url="jdbc:mysql://localhost/jira?useUnicode=true&amp;characterEncoding=utf-8"
    注:一定要加:useUnicode=true&amp;amp;characterEncoding=utf-8,并在c:\WINDOWS\my.ini(mysql配置文件)中的[mysqld]部分加入:default-character-set=UTF8(即设置mysql的默认字符集为UTF8),否则有乱码。

    5、修改%JIRA_HOME%\atlassian-jira\WEB-INF\classes\entityengine.xml文件,查找:<datasource name="defaultDS" field-type-name="hsql"
          helper-class="org.ofbiz.core.entity.GenericHelperDAO"
    将hsql更改为:mysql。

    6、运行%JIRA_HOME%\bin\startup.bat,输入:http://localhost:8080,看到jira的安装向导,安装成功。

    注:
    a)将mysql5的jdbc驱动:mysql-connector-java-5.0.5-bin.jar放到%JIRA_HOME%\common\lib目录下。
    b)mysql的安装参见:http://www.blogjava.net/wiflish/archive/2006/12/26/90123.html
    c)由于jira是收费的,启动jira自带的tomcat,进入安装向导后,需要输入注册码
  • 手机功能测试之飞行模式

    2009-06-24 11:02:34

    手机功能测试之飞行模式 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/22/n-117522-2.html
  • 从一个实例详解敏捷测试的最佳实践(上)

    2009-06-09 17:20:12

    从一个实例详解敏捷测试的最佳实践(上) - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/50/n-109650.html
  • 融合多业务与多技术 3G终端测试重要性凸显

    2009-06-08 11:01:42

    融合多业务与多技术 3G终端测试重要性凸显 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/88/n-129988.html
  • 如何蒸煮手机(True Brew测试)

    2009-06-08 11:00:34

    如何蒸煮手机(True Brew测试)【一】 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/53/n-129553.html

     

  • 一位微软软件测试开发工程师的成长体验

    2009-05-27 14:48:09

    1. 一位微软软件测试开发工程师的成长体验 - 51Testing软件测试网-中国软件测试人的精神家园
      http://www.51testing.com/html/20/n-130620.html
  • 微软软件测试的可借鉴之处

    2009-05-14 16:17:32

    微软软件测试的可借鉴之处 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/23/n-82223.html
  • 从测试组长成长为测试经理

    2009-05-14 11:47:41

    从测试组长成长为测试经理 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/84/n-124484.html
  • Linux实用命令全集

    2009-03-10 11:08:41

     

    Linux实用命令全集之一 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/88/n-108588.html

    Linux实用命令全集之二 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/89/n-108589.html

     

    Linux实用命令全集之三 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/76/n-110076.html

  • 如何构建一个QTP测试框架

    2009-03-09 15:39:38

    如何构建一个QTP测试框架 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/01/n-109901-2.html
  • 2008年度软件测试工具英雄榜

    2009-03-09 15:07:41

    2008年度软件测试工具英雄榜 - 51Testing软件测试网-中国软件测试人的精神家园
    http://www.51testing.com/html/85/n-109085.html
251/212>
Open Toolbar