[解析] 本题考查Web应用测试相关知识及应用。Web应用测试除了类似传统软件系统测试的性能测试、压力测试等之外,还需要测试页面、链接、浏览器、表单和可用性等,由于Web应用部署访问的大众化特点,对安全性尤其要重视。
此类题目要求考生阅读题目对现实问题的描述,根据对问题的分析,回答测试有关的问题。本题目说明中除了功能背景之外,给出了几个技术点,即采用Java EE平台,页面中采用表单实现数据的提交与交互,使用图形(Graphics)以提升展示效果。
第一小题考查Web应用安全性测试的XSS攻击。
XSS攻击测试是Web应用安全性测试的主要内容之一。
许多Web应用系统在某些情况下,接收页面上传的内容,并入新页面,作为新页面的内容。例如,在新闻网用户可以对新闻进行评论,用户可以输入如下带有HTML标记的内容:
<Script>alert("Hello World!"); </Script>
在用户提交之后,标记将提交到服务器上,并在有新用户访问新的页面中显示,此时用户所看到的网页中包含以上标记的部分元素可能是:
<div>
<Script>alert("Hello World!"); </Script>
</div>
从用户的角度看,该网页中就出现了弹出窗口提示,显示“Hello World!”。如下图所示:

即:用户输入的内容已经被浏览器成功执行。再如输入如下内容:
<b onmouseover=alert('Hello!')>click me!</b>
在用户提交之后,后续再访问时,用户所看到的网页中包含以上标记的部分元素可能是:
<div>
<b onmouseover=alert('Hello!')>click me!</b>
</div>
即新用户所看到网页中显示“Click me!”。当用户鼠标移过此文字时,就会弹出窗口(左侧为Chrome弹出,右侧为IE9直接给出的提示窗口,多次鼠标滑过操作Chrome提示窗口多了一行浏览器对阻止这类代码的创建新窗口的选项,firefox类似):
而如果这类代码都可以执行,就存在被真正恶意攻击者攻击的可能,而且可能造成各类安全问题。所以网站提交代码中的任何脚本、页面功能符号都不应该被直接接受作为功能符号在后续使用。
本题目说明中采用表单实现数据提交与交互,在提交数据时,对数据的内容中包含的特殊内容要进行测试。在测试用例时,要考虑HTML标记符、脚本。所以测试用例的设计主要考虑<Script>、<b>等功能符号。在页面上真正需要HTML标记的,在接收到服务器端时,先进行转义。
第二小题考查页面的展示效果方面的测试。
Web页面展示效果在用户界面友好性方面非常重要,是用户界面测试的主要内容之一。图形测试主要检查图片大小、颜色饱和度和对比度是否合适、需要突出的链接的颜色是否容易识别、是否正确加载等等。
第三小题考查Web应用页面测试。
Web页面测试内容包括:页面一致性、用户友好性、浏览器兼容性、布局合理性、直观的导航等。要关注页面是否一致,每个页面上是否设计友好的用户界面,导航系统是否直观,是否考虑浏览器的兼容性,元素布局是否合理,功能块布局是否合理,页面颜色搭配是否合理,字体大小是否合理等方面。另外,还要考虑页面文件的命名体系是否建立。
第四小题考查Web应用安全性方面的SQL注入,SQL注入是Web应用安全性测试的重要方面之一。
许多Web应用系统采用某种数据库,接收用户从Web页面中输入,完成展示相关存储的数据(如检查用户登录信息)、将输入数据存储到数据库(如用户输入表单中数据域并点击提交后,系统将信息存入数据库)等操作。在有些情况下,将用户输入的数据和设计好的SQL框架拼接后提交给数据库执行,就可能存在用户输入的数据并非设计的正确格式,就给恶意用户提供了破坏的机会,即SQL注入。恶意用户输入不期望的数据,拼接后提交给数据库执行,造成可能使用其他用户身份,查看其他用户的私密信息,还可能修改数据库的结构,甚至是删除应用的数据库表等严重后果。SQL注入在使用SSL的应用中仍然存在,甚至是防火墙也无法防止SQL注入。因此,在测试Web应用时,需要认真仔细设计测试用例,采用Web漏洞扫描工具等进行检查,进行认真严格的测试,以保证不存在SQL注入机会。
本系统实现时,对销售订单的更新所用的SQL语句如下:
PreparedStatement pStmt=connection.prepareStatement("UPDATE SalesOrder SET status= ? WHERE OrderID= ?;");
然后通过setString(...);的方式设置参数值后加以执行。
在SQL语句中采用参数的方式传递前台传递来的值,因为不论是什么值,都会只作为setString(...)的参数值,不会作为SQL语句的其他功能符,所以本SQL语句更新订单的方式是防止SQL注入的。设计如下测试SQL注入的测试用例:
status: 'fulfilled' --, OrderID: '2014' OR '1'='1'
检查执行结果,或者传递给数据库的SQL语句,会发现所有用例中的功能字符都会经过特定的转义后作为status和OrderID的值。和拼接SQL的方式不同,采用参数形式传递时,Java的JDBC驱动自动会将其按照相应的类型处理,功能符号会进行转义。因此,测试用例中的注释--、OR等都会作为参数的值,不会作为功能符,也就不会改变SQL语句本身的功能结构,该SQL语句是安全的。