发布新日志

  • 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析

    2015-12-10 16:30:42

    使用 AppScan 进行扫描

    针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan)、执行(Do)、检查(check)、分析(Analysis and Action)。

    1. 在计划阶段:明确目的,进行策略性的选择和任务分解。
      1. 明确目的:选择合适的扫描策略
      2. 了解对象:首先进行探索,了解网站结构和规模
      3. 确定策略:进行对应的配置
      4. 按照目录进行扫描任务的分解
      5. 按照扫描策略进行扫描任务的分解
    2. 执行阶段:一边扫描一遍观察
      1. 进行扫描
      2. 先爬后扫(继续仅测试)
    3. 检查阶段(Check)
      1. 检查和调整配置
    4. 结果分析(Analysis)
      1. 对比结果
      2. 汇总结果(整合和过滤)

    下面我们针对每个阶段,进行具体的阐述。


    准备阶段

    AppScan 安装环境要求和检查

    为了保证更好的扫描效果,安装 AppScan 的硬件建议配置如下:

    表 1. Rational AppScan 安装配置要求

    硬件最低需求
    处理器Pentium P4,2.4 GHz
    内存2 GB RAM
    磁盘空间30 GB
    网络1 NIC 100 Mbps(具有已配置的 TCP/IP 的网络通信)

    其中,处理器和内存建议越大越好,而磁盘空间,建议系统盘(一般是 C 盘)磁盘空间至少保留 10G,如果系统盘磁盘空间比较少,可以考虑把用户文件等保存在其他盘;如默认的用户文件是:C:\Documents and Settings\Administrator\My Documents\AppScan;可以修改为其他路径。该路径可以在菜单栏中依次选择工具 - 选项 - 一般 - 文件位置部分修改。

    图 1. 设置文件保存路径

    图 1. 设置文件保存路径

    磁盘要求:修改临时文件路径

    有时候大家会发现,已经把上面的地址都修改到了其他盘,但是在扫描过程中,还是会发现 C 盘的空间快速被消耗,分析原因,是因为很多临时文件都保存在 C 盘,AppScan 中有一个隐藏的参数 APPSCAN_TEMP 来设置临时文件位置。在扫描过程中,如果系统盘空间比较下,可以通过修改系统变量来修改到其他硬盘空间。

    临时文件位置说明:描述正常操作期间 AppScan 将其临时文件保存到的位置。缺省情况下,AppScan 将其临时文件存储在以下位置:

    C:\Documents and Settings\All Users\Application Data\IBM\Rational AppScan\temp

    如果需要修改此缺省位置,请按照要求编辑环境变量 APPSCAN_TEMP 的路径。(访问环境变量的方法是,右键单击我的电脑,然后依次选择属性 > 高级 > 环境变量。)

    注意:在新位置的路径中绝不能有任何 Unicode 字符。

    修改 AppScan 中的临时文件:

    1. 桌面上鼠标右键选择“我的电脑”,选择“属性”
    2. 选择“高级”,“环境变量”
    3. 增加一个新的“用户环境变量”,名字是“APPSCAN_TEMP”,设定路径,指向您希望保存临时文件的目录。

    计划阶段

    在计划阶段,首先明确几个问题:

    1. 关心哪些类型的安全问题,根据这些安全问题来设置扫描规则。
    2. 要扫描的网站地址,网站的业务特点。

    扫描策略的选择

    试想,我们现在要扫描的是某个移动公司的网站系统,该网站系统提供多个内容频道,还可以连接到多个其他移动公司网站和业务网站,我们本次安全测试重点关心的是门户网站本身和其上面的网上营业厅业务。这就是一个比较明确的测试目标对象。

    然后,确定扫描策略,我们主要关心该网站是否存在跨站点脚本执行和 SQL 注入的问题,则在扫描规则中,我们就可以选择这两种类型的规则,其他规则都排除。

    具体的扫描规则定制,可以在扫描配置 - 测试 - 测试策略中选择:

    在测试策略中,有多种不同的分组模式,最经常使用的是“严重性”,“类型”,“侵入式”、“WASC 威胁分类”等标准,根据不同分组选择的扫描策略,最后组成一个共同的策略集合。

    根据我们这次扫描的目标,关心的是跨站点脚本执行和 SQL 注入的问题,而且不考虑“基础结构”级别的安全问题。则就可以首先选择一个默认的扫描策略,然后全部置空,再选择

    跨站点脚本执行和 SQL 注入,最后再去除这两种扫描策略中和基础结果相关的安全问题。

    方法如下:

    1. 选择缺省的扫描策略,或者把当前的扫描策略,切换到按照“类型”分类,取消掉“基础结构”和“应用程序”两种类型。

      说明:则把扫描策略置空,没有选择任何的扫描策略,指所有分布类型选择“类型”分类,是因为类型分类里面含有的类型,只有两种类型,可以快速全部都取消掉。

    2. 分组类型,切换到“WASC 威胁分类”,选择“SQL 注入”和“跨站点脚本编制”。
    3. 分组类型,切换到“类型”,发现这时候“基础结构”和“应用程序”两种类型的扫描策略都是选择上的模式,而且是虚线,说明这两种类型下均有部分扫描策略被选择了。
    4. 我们不关心“基础结构”级别的安全问题,所以在这里取消“基础结构”

    图 2. 按“类型”分类的测试策略

    图 2. 按“类型”分类的测试策略
    1. 分组类型,切换到“侵入式”类型,下面有“非侵入式”和“侵入式”两种分类。取消“基础结构”级别的测试。

    侵入式的测试用例,往往因为有比较强的副作用,可能对系统造成伤害,所以一般扫描生产系统的时候,很少选择。我们可以查看一个 SQL 注入类型的侵入式安全问题,在“输入以查找”输入框中输入“SQL”,然后回车查询。可以看到测试变体的描述“将参数值设置为 Declare/Case SQL 注入攻击(尝试关闭 DB 服务器)”,则扫描过程中,会使用该测试用例去执行尝试关闭数据库的命令,如果该测试用例执行通过,则就关闭了数据库,则整个系统就瘫痪!所以,要很慎重的选择“侵入式的测试用例”。

    图 3. 查询测试策略

    图 3. 查询测试策略

    图 3 大图

    其他的在“类型”中,“应用程序”类型表示该问题的存在是因为应用程序不严谨,代码存在安全问题而造成的,修改方法就是修改原代码;而“基础结构”类型,则表示该问题是配置问题,建议修改系统配置或者安装最新的补丁(经常是中间件或数据库补丁)。

    了解被测试网站

    在对网站进行测试之前,我们经常需要先大概了解下这个网站,比如该网站使用了哪些技术,提供什么类型的业务(功能),网站规模等。这些都和我们的扫描设置相关。如下图,就是我们经常使用的一个调查表,了解被测试系统的基本特点。

    表 2. 记录被测网站特点

    应用系统名称访问地址应用系统架构(JEE/.Net/PHP…)URL 数量登陆方式备注
          

    其中,用户经常迷惑的是 URL 数量,有些时候,用户很难评估出一个系统的大概页面数量,而按照 AppScan 的工作原理,扫描是针对页面的每个参数的,如果页面越多,参数越多,则扫描要运行的时间也就越长,扫描保存成的接过文件也是越大,更需要进行分解。如果一个扫描任务,本身的已访问 URL 数超过 5000,评估的要运行的安全测试用例数超过 50,000,则建议进行扫描配置的分析,并根据分析结果,决定是否需要进一步的任务分解和分工。

    那么,如果可以了解到网站具体有哪些页面呢?这里我们就可以利用 AppScan 的探索(页面爬行)能力。

    在扫描配置里面设置了主 URL 以后,工作菜单中中依次选择扫描 - 仅探索。对网站进行探索。一般会让探索工具运行 10 到 30 分钟,看该网站具体存在哪些页面,哪些参数等。这个就可以切换到“应用程序数据”视图来查看。

    我们一般关心这几个视图:

    • 已访问的 URL():AppScan 已经探索到并且进行了分析的页面
    • 已过滤掉的 URL():AppScan 已经发现,同时根据扫描配置,认为不需要进行安全扫描的页面。
    • 中断链接 URL():AppScan 发现了,但是无法访问到或者访问出错的页面,如 404 页面不存在,或者 500 服务器错误等。

    伪静态页面

    可以选择左边“我的应用程序数据”中的 URL 树下的每一个节点,察看该节点已访问的 URL,已过滤掉的 URL 等。

    如在已访问的 URL() 中,我们发现大量类似如下结构的 HTML 页面:

    http://www.Test.com//focus/satisfy/file5.html
    http://www.Test.com//focus/satisfy/file6.html
    http://www.Test.com/m-zone/news/dgdd/quanbu/bylb/file5.html

    其共同特征,都是以 html 为后缀名,最后的文件名格式都是 file+ 数字格式;这种类型的页面经常存在新闻,论坛等。如果访问这些页面,发现页面结构相同,差异的都是里面的文本内容,如提供不同的新闻内容等,这些页面就是所谓的“伪静态页面”,其实是网站发布系统动态产生的,由于结果相似,在安全扫描中,没有必要针对这些页面每次都进行扫描。如针对每个目录下面存在的 file+ 数字格式的页面,我们就可以设置正则表达式来过滤,比如,在扫描配置 - 排除路径和文件中

    排除所有该类型的页面;.*file\d+.html

    增加“例外”,对该类型的页面只扫描 file1.html 和 file20.html

    经常存在的其他类似页面,还有 news1.html、content200.html 等类型,采用方法类似。

    业务类型的“冗余路径”

    和“伪静态页面”对应的有另外一种动态页面,这些页面按照默认的扫描规则,会被自动过滤,但是根据真实的业务场景,这些页面确实不能被过滤的,如访问 demo.testfire.net 时候在“已过滤 URL”内会显示有如下的 URL 地址,过滤原因都是“路径限制”:

    http://www.Test.com/default.aspx?content=inside_community.htm
    http://www.Test.com/default.aspx?content=inside_press.htm
    http://www.Test.com/default.aspx?content=inside_executives.htm

    选择 URL 地址,鼠标右键“在浏览器中显示”,会发现这里显示的页面内容完全不一样,和上面的“伪静态页面”正好相反,这些参数相同,参数值不同的动态页面,是真正的业务页面,是不能过滤掉;如果过滤,则会很多后续的业务页面无法发现。那这些页面为什么会被过滤了呢?按照什么样的规则被过滤掉的?

    在 AppScan 中,默认情况下是有一个“冗余路径限制”(在“扫描配置 - 探索选型 - 冗余路径限制”),默认对于冗余的页面,最多扫描 5 次,关键的问题是,什么页面被被 Appscan 认为是冗余页面呢 ?

    图 4. 冗余路径设置

    图 4. 冗余路径设置

    简单说:

    点击查看代码清单

    http://www.Test.com/default.aspx?content=inside_community.htmhttp://www.Test.com/default.aspx?content=inside_press.htm

    Appscan 是根据“?”号来分隔的,如果 ? 号前面的内容都相同,则就被认为是冗余页面,所以上面的页面就是冗余页面了。

    遇到这样情况的页面,最多被访问 5 次。而这 5 次,具体是使用了哪些参数,是随机的,具体访问到的页面也会在“应用程序数据”视图的“已访问的 URL”中查看:

    点击查看代码清单

    http://www.Test.com/default.aspx?content=business.htmhttp://www.Test.com/default.aspx?content=business_lending.htmhttp://www.Test.com/default.aspx?content=inside_contact.htm

    可是,在本例中 content 参数值不同的时候,其实根据业务逻辑,不应该算作“冗余页面的”,而按照配置,也会被自动过滤了,遇到这种情况,就需要考虑增加“冗余路径限制”,如设置为 20 或者 50。以可以更多次访问这些页面。

    这些情况经常存在于跳转参数等情况。

    顺便备注下,“冗余路径限制”,功能设置的目的是为了处理类似论坛 BBS 等页面,只有文本内容不同,页面架构完全相同的页面:如

    http://www.Test.com/showthread.php?id=1
    http://www.Test.com/showthread.php?id=2
    http://www.Test.com/showthread.php?id=3

    而我们在测试 demo.testfire.net 时候会发现每次的安全测试结果都可能有差别,一个很大的原因就是每次访问的页面是不同的,就是这个设置的影响。

    分析重复的“脚本参数”

    在上面的步骤中,分析了“伪静态页面”,对其应该通过“排除路径或者文件名”的方法设置排除规则;而对于“业务类型的冗余路径”,则需要通过增加“冗余路径显示”个数等的方法进行扩充,以扫描到这些 URL。我们在这个步骤来分析另外一种参数,脚本参数

    在“我的应用程序数据”树状结构下,鼠标选择目录以后,在右边视图中选择“脚本参数”,然后查看是否存在不同页面(URL) 存在相同或者类似参数的情况:如下图,在不同 URL 中,都存在 kbKey 参数,默认的参数值是“请输入您要搜索的问题”:

    图 5. 脚本参数

    图 5. 脚本参数

    图 5 大图

    访问这些 URL,发现每个页面内都包含了一个搜索功能,这就是为什么在不同页面都发现了该参数。而从业务角度,这些搜索页面在一个 URL 中进行测试以后,没有必要在另外一个页面也进行测试。而且该参数值的变化,可以认为是冗余页面,没有必要进行下一步的重新探索和测试。这可以通过上图中,选择该参数后,鼠标右键,选择“添加到‘参数和 Cookie’选项卡中的列表”来实现。选择后弹出下面的页面:

    图表 6 添加参数定义(根据参数来设置冗余路径)

    图 6. 添加参数定义(根据参数来设置冗余路径)

    图 6 大图

    在该页面中,点击“其他选项-冗余调整”,取消选择任何一个选择框,则表示无论是否含有该参数,无论该参数值是否发生变化,都不认为是新页面,没有必要重新测试,而且不应该因为该参数的变化去影响其他参数的测试。

    我们知道,AppScan 中的测试,是针对页面的每个参数进行的,而且一个参数值的变化会要求重新测试其他的参数,所以该设置,可以大大减少测试用例数。

    关于更多的设置说明,可以参照下面的解释:

    表 3. 设置说明

    选框选中时 ...
    只要添加或除去此参数 /cookie,便再次探索 URL。在探索阶段,如果两个 URL 的唯一区别在于一个包括此参数,而另一个不包括此参数,那么将其视为不同 URL,并且对两者都进行探索。
    例如,如果是以下两个 URL,两者都将进行探索:
    ...page.jsp
    ...page.jsp?thisParam=Value
    如果您取消选中此复选框,那么在此情况下,将仅发送一个请求,而其他请求将被废弃。
    只要此参数 /cookie 的值更改,便再次探索 URL。在探索阶段,如果两个 URL 的唯一区别在于此参数 /cookie 的值,那么将其视为不同 URL,并且对两者都进行探索。
    例如,如果是以下两个 URL,两者都将进行探索:
    ...page.jsp?thisParam=Value1
    ...page.jsp?thisParam=Value2
    如果您取消选中此复选框,那么在此情况下,将仅发送一个请求,而其他请求将被废弃。
    只要添加或除去此参数 /cookie,便重复所有相邻参数 /cookie 测试。在测试阶段,如果两个 URL 的唯一区别在已添加或除去了此参数,那么将其视为不同 URL,并且再次测试相邻参数。
    例如,如果是以下两个 URL,将为相邻参数生成两组完整的测试,每个 URL 一组。
    ...page.jsp?adjacentParam=<test_this>
    ...page.jsp?adjacentParam=<test_this>&thisParam=Value
    如果您取消选中此复选框,将为相邻参数仅生成一组测试。
    只要此参数 /cookie 的值更改,便重复所有相邻参数 /cookie 测试。在测试阶段,如果两个 URL 的唯一区别在于此参数 /cookie 的值,那么将其视为不同 URL,并且再次测试相邻参数。
    例如,如果是以下两个 URL,将为相邻参数生成两组完整的测试,每个 URL 一组。
    ...page.jsp?adjacentParam=<test_this>&thisParam=Value1
    ...page.jsp?adjacentParam=<test_this>&thisParam=Value2 如果您取消选中此复选框,将为相邻参数仅生成一组测试。

    查看每个目录页面个数

    如果一个扫描任务,本身的已访问 URL 数超过 5000,评估的要运行的安全测试用例数超过 20,000,则建议进行扫描配置的分析,并根据分析结果,决定是否需要进一步的任务分解和分工。

    我们在“我的应用程序数据”树状结构下,鼠标选择目录以后,在右边视图中选择“已访问的 URL()”,记录 URL 数目,如果该目录 URL 数目比较大(超过 500)则可以考虑为该目录单独建立一个扫描任务,只扫描该目录下面的链接。


    执行阶段

    根据在“计划阶段”确定的扫描策略,和进行的扫描设置,重新进行探索(扫描菜单依次选择:重新扫描 - 重新探索);后继续分析页面数和测试用例数目,如果控制页面数 5000 个以内,测试用例数 20,000 个以内,则可以直接进行扫描;如果没有,建议继续分析,优化扫描配置。

    分阶段测试

    AppScan 的扫描过程分为“探索”和“测试”两个阶段,默认情况下,使用的是完全扫描模式,即是边探索边测试的。如果网站比较大,建议考虑先探索后测试的模式。

    如当 URL 达到 5000,需要进行的测试达到 50000 的时候,可以暂停扫描,手工停止探索,选择“继续仅测试”。对已经发现和分析的页面进行测试,测试完毕,再来选择“继续仅探索”,即:

    继续仅探索 --- 继续仅测试—继续仅探索 - 仅测试的一个循环过程。

    在这个过程,一个阶段结束以后,建议查看下 .Scan 文件的大小,如果大小超过了 500M,则建议考虑任务分解,可以根据目录把一个扫描任务分解为多个,或者根据扫描策略来进行分解。

    该方法是利用了 AppScan 扫描过程中,探索测试可以分离,而且支持扫描过程中断后继续扫描的特性。

    按照业务分解扫描任务

    在实际工作中,我们扫描的一个大型网站,往往包含多个频道,而每个频道可能需要的扫描配置都不同,这些配置甚至互相冲突。如一个网站的提供了 BBS 论坛功能:

    http://www.Test.com/WWW.TEST.COM/showthread?channel=1&thread=1001
    http://www.Test.com/WWW.TEST.COM/showthread?channel=30&thread=2001

    对于这样的页面,访问后发现页面结构相同,只是文本内容不同,则应该使用“冗余路径限制”参数,控制扫描次数,没有必要多次扫描。

    同时,该网站的一个服务频道存在如下的页面:

    http://www.Test.com/default.aspx?content=inside_executives.htm
    http://www.Test.com/default.aspx?content=privacy.htm

    即上面提到的业务类型的“冗余路径”,应该多次扫描,配置上要求增大“冗余路径限制”参数。

    在这种情况下,就很有必要根据业务分别建立扫描任务,每个任务采用不同的扫描配置。


    检查阶段

    在扫描执行过程中,需要检查,看是否存在下面的情况:

    1. 提示网络连接不上,或者提示部分页面无法打开。则检查是否是扫描速度过快,服务器不能承受不了,根据情况修改扫描配置 - 连接 - 通信和代理,增加“超时”数,并考虑减少“并发线程数”,以允许更长时间的等待页面影响并减少对服务器的访问连接数。
    2. 发现扫描出的安全问题,包含我们不关心的安全隐患,则取消掉这些规则。如发现了一个安全隐患,类型是“SQL 注入文件写入(需要用户验证)”,该问题是需要用户根据提示来检查的,并且是针对 SQL 数据库的,如果我们使用的数据库不是 SQL 数据库,或用户确认后没有发现线索,则就可以在扫描配置 - 测试 - 测试策略中取消选择该策略。
    3. 执行“计划阶段”的检查,看是否还存在“伪静态页面”,“业务类型的冗余路径”等,如果存在,则调整扫描配置。

    分析阶段

    在分析阶段,结合业务特点,检查是否扫描范围,分析扫描结果,并针对扫描出来的问题,进行分析,产生多种类型的报告等。

    扫描结果检查

    扫描结束后,建议切换到“应用程序数据”视图中,对页面进行分析,检查是否核心页面都被测试到了。重点检查如下部分:

    1. 交互式 URL:一些页面,必须输入正确的信息,才可以跳转到下一个页面,比如查询手机欠费的页面,必须输入正确的 11 位手机号码;查询身份信息的页面,必须输入 18 位的身份证号才可以进入后续页面。如果没有配置,AppScan 怎么知道输入这些信息?所以如果存在“交互式”URL,可以选择该 URL 以后,鼠标右键,选择手动探索,在 AppScan 浏览器中访问这些页面,输入对应的数据,则 AppScan 会自动记录这些输入,并填充到扫描配置 - 自动表单填充中。
    2. 中断链接:看哪些页面在扫描过程中,访问出错或者无法访问,如针对 time out 的页面,就可能是因为网络原因,扫描过程中没有及时响应,可以选择“重试所有中断链接”重新进行访问。

    报告分析

    我们需要对报告进行对比分析或者报告汇总合并,方法如下:

    1. 增量分析:在实际工作中,经常对一个网站进行定期扫描,那么我们可以使用报告对比功能,对比两次产生的结果,检查哪些问题已经修改,哪些是新发现的安全隐患。方法是选择报告 - 增量分析。
    2. 报告汇总和合并:而如果我们在执行阶段,按照业务或者目录进行了分解,最后可能需要对多份扫描结果进行合并和汇总,合并过程中重复的问题只记录一次,如扫描任务 A 和任务 B 都发现了 apply.jsp 的 ID 参数存在 XSS 安全隐患,则合并后只记录一次。报告的合并需要使用到 AppScan 企业版,其具有 AppScan 标准版的扫描功能和强大的报告汇总功能,可以产生仪表盘,报告的对比分析,趋势分析等。可以把 AppScan 标准版的报告发布到 AppScan 企业版中,方法是菜单栏中依次选择文件 - 导出 - 将结果发布到 AppScan Enterprise。

    图 7. AppScan 标准版的扫描结果发布到企业版

    案例分析

    工作中遇到一个案例,使用 AppScan 扫描扫描了 3*24 小时,扫描的 scan 文件已经达到 9G;扫描还在持续进行中,总体进度完成了 30%,可以想象扫描速度已经很缓慢,还需要多长时间才可以完成扫描?扫描完成以后如此大的结果文件是否可以成功打开和修改保存 ?

    按照我的经验,如果扫描结果文件大于 1G,那就很有必要立即停止扫描,进行配置分析。我们的分析过程如下:

    1. 和用户讨论,确认关心的安全问题,根据这些安全问题制定测试策略;讨论后确定选择“SQL 注入”和“跨站点脚本编制”两种类型的安全隐患。
    2. 确定网站范围,被扫描应用是典型运营商门户网站,重点要扫描门户网站自身和其上面提供的“网上营业厅”服务。
    3. 分析被测网站,使用 AppScan 配置了网站主页面,然后选择“仅探索”运行 20 分钟后,发现 30,000 多个页面。停止探索,开始分析页面。
    4. 分析发现该网站同一个链接,存在 http、https 访问的不同情况,而且两种访问方式访问到的页面内容相同,则过滤掉 https 的请求,集中测试 http 请求。
    5. 分析发现存在大量的“伪静态页面”,如:
      http://www.Test.com//focus/satisfy/file5.html
      http://www.Test.com//focus/satisfy/file6.html

      在扫描配置 - 排除路径和文件中:

      排除所有该类型的页面;.*file\d+.html

      增加“例外”,对该类型的页面只扫描 file1.html 和 file20.html

    6. 同时,发现了 swf 文件,应该不准备扫描 Flash,所以在“排除文件类型”中,设置根据后缀名排除 swf 文件。
    7. 发现
      http://www.Test.com/service

      目录下存在大量如下类型的页面,都是 menu 参数值不同,访问以后发现出现的是页面中有不同的超链接:
      http://www.Test.com/service/Business.do?menu=Query
      http://www.Test.com/service/Business.do?menu=Open
      http://www.Test.com/service/Business.do?menu=Service

      确认该页面是业务类型的“冗余路径”,应该全面扫描,则需要把“冗余路径设置”调整为比较大的参数,同时该频道是网上营业厅频道,也要求用户先登录。所以针对该目录建立一个单独的扫描任务,只扫描该目录和其下子目录。

    8. 分析发现 index.jsp 在多个目录下出现,而且每次出现都有两种格式,即没有参数和有固定的三个参数,每次的参数值都相同。如:

      点击查看代码清单

      http://www.Test.com//rdwd/jfmz/jifen/index.htmlhttp://www.Test.com//rdwd/jfmz/jifen/index.html?queryType=common&applyArea=010
          &kbKey= 请输入您要搜索的问题http://www.Test.com//rdwd/txl/rdwdznyd/index.htmlhttp://www.Test.com//rdwd/txl/rdwdznyd/index.html?queryType=common&applyArea=010
          &kbKey= 请输入您要搜索的问题

      访问上面的页面,发现内容相同,则说明是否带这三个参数不会影响探索发现更多的页面,则可以设置这三个参数每次是否出现,是否有不同值都可以认为是同一个页面。

      设置方法:扫描配置中依次选择“参数和 Cookie”来实现。然后增加 queryType,applyArea,kbKey 三个参数,均设置为“是否有参数”、“参数是否变化”不影响测试的模式。

    9. 切换到“应用程序视图”,分析“中断链接”,发现一些页面存在“范围内容超过最大容量的”的情况,在 IE 浏览器中直接访问,发现这些页面存在死循环,页面内容无限递增。则在扫描配置 - 排除路径和文件中排除这些页面。
    10. 根据以上设置,建立了两个扫描任务,均扫描“SQL 注入”和“跨站点脚本编制”。重新探索后,页面总数减少到 4000 多,测试用例数减少到接近 50,000,两个扫描任务均在 8 个小时内完成。

    总结

    AppScan 作为一种自动化的扫描设置工具,我们了解其工作原理后,需要根据被测系统的业务特点和网站结构特点,优化配置,从而可以快速的针对性扫描。

    常用的设置是可以利用其“探索”功能,快速得到结构,然后分析是否存在“伪静态页面”,业务上的“冗余路径”页面,“参数重复”页面等,在扫描配置中对应设置。

    同时,如果设置后网站规模还是比较大,则可以根据业务分解为多个扫描任务,从而分而攻之,快速扫描,并结合企业版等工具,综合汇总分析。

    参考资料

    学习

    获得产品和技术

    • 下载免费的 IBM Rational AppScan Standard Edition(标准版)试用版
    • 访问 Rational AppScan 产品专题,了解最新的 IBM Rational AppScan 产品文档和产品信息,获得关于 IBM Rational AppScan 及与 Web 应用安全相关的技术文档和参考资源,还可以查阅产品概览、产品手册、产品技术支持、试用版下载,以及相关文章、教程、多媒体课堂和产品演示等信息。
    • 获取免费的 Rational 软件工具包系列,了解最新的 IBM Rational 软件开发工具技术文档和资源。
    • 下载更多免费的 IBM Rational 试用版软件,了解 IBM Rational 软件的最新特性。
    • 获取更多 IBM 试用版软件,并熟练掌握来自 DB2®、Lotus®、Tivoli®,以及 WebSphere® 的开发工具和中间件产品,用这些试用版软件开发您的下一个项目。这些试用版软件可以免费直接从 developerWorks 下载。

    讨论

  • 关于Rational AppScan Standard扫描过程中发生的通信错误

    2015-12-10 14:02:28

    文档信息:

    Rational AppScan Standard Edition

    软件版本:7.7, 7.8, 7.9

    操作系统:Windows
    用途版本:Express, Standard
    参考号:1472721
    修改日期:2011-03-30
     
    Technote (troubleshooting)

    问题(摘要)

    [Simplified Chinese] 使用IBM Rational AppScan Standard版本对Web程序进行扫描时,如何对发生的通信问题进行分析?

    症状

      现象 1

      在扫描过程中扫描日志(选择菜单[查看] > [扫描日志]或者从Rational AppScan Standard安装路径下的Logs文件夹中打开ScanLog.log文件)可能会显示以下格式的错误消息:

      [DATE], [TIME]: Cannot connect to host: [IP/HOSTNAME]...
      [DATE], [TIME]: Test [TEST_NUMBER] [TEST_NAME] failed due to communication error: [PATH]...
      [DATE], [TIME]: Connection established with host: [IP/HOSTNAME]

      现象 2

      或者在AppScan系统日志(选择菜单[帮助] > [AppScan 日志]或者从Rational AppScan Standard安装路径下的Logs文件夹中打开AppScanSys.log文件)中可能会发生如下的错误消息:

      [DAY_OF_WEEK], [DATE], [TIME] Warning: Communication problems occurred while testing URL '[PATH]' for '[TEST_NAME]'

      同时也可能看到如下消息:

      [DAY_OF_WEEK], [DATE], [TIME] System : Server [IP/HOSTNAME] is not responding...
      [DAY_OF_WEEK], [DATE], [TIME] System : Server [IP/HOSTNAME] is responding again

      或者如下消息:

      [DAY_OF_WEEK], [DATE], [TIME] System : Proxy [IP/HOSTNAME] is not responding
      [DAY_OF_WEEK], [DATE], [TIME] System : Proxy [IP/HOSTNAME] is responding again



    原因

      通常由于以下原因会导致发生通信问题:

      原因 1
      在Rational AppScan Standard的主机上安装的个人防火墙或防病毒软件会屏蔽向外发送的信息。

      原因 2
      企业防火墙软件会将AppScan发送的请求当作对网站的攻击从而切断连接。

      原因 3
      当Rational AppScan Standard对于响应速度慢的Web服务器发送大量的请求时,请求会被服务器拒绝。

    解决问题

      原因1的解决方案:
      在探索和测试的阶段需要确保此类软件已经停止运行。

      原因2的解决方案:
      在系统管理员的协助下需要确认企业防火墙是否真正切断AppScan的连接。通常当网络中安装了新的代理服务器或防火墙时,会屏蔽请求从而降低Rational AppScan Standard的工作效率。

      原因3的解决方案:
      1.在[扫描配置] > [通信和代理]中,将[线程数]降为1同时将[超时]增大为30秒。如果能够消除通信错误消息的话,可以少量增加线程的数目。
      2.可以设定Rational AppScan Standard使用HTTP/1.1来解决通信问题。关于设定AppScan使用HTTP/1.1更多的内容,请参照Technote 1298662: Forcing Rational AppScan Standard to use HTTP/1.1

     

    原文链接:http://www-01.ibm.com/support/docview.wss?uid=swg21472721

  • 性能测试知多少---测试环境搭建

    2015-12-08 14:02:00

    在进行性能则试前,需要完成性能测试的搭建工作,一般包括硬件环境、软件环境及网络环境,可以要求配置和开发工程师协助完成,但是作为一个优秀性能测试工程师,这也是你的必备技能之一。

     

    性能测试环境与功能测试环境的区别                                               

     

      那么性能测试环境与功能测试环境有什么不同呢?性能测试对测试环境的干净、独立性要求更高,更为严格。对于一个相对较规范的公司,都会建立其独立的研发环境、测试环境、线网环境(最终运行软件的环境)。

      这里多扯一点,系统可以分为C/S架构的系统与B/S架构的系统,C/S架构的系统又可以分为两种,第一种是基本不用与服务器连接的,比如我们用到的java虚拟机JVMphoto shop平面处理软件,我们可以开启软件更新功能,这时软件向服务器发请求,查当前版本是否是服务器端发布的最新版本,然后,提示用例是否需要更新或下载最新版本的软件。当然,我们也可以关闭更新功能或不检测更新。那么这个软件一样可以在电脑上运行。对于这类软件,我的主要测试环境就是用户的电脑。不同硬件配置、不同操作系统下对软件一系列,从安装使用到卸载。除了验证软件与硬件和系统的兼容性能,还需要验证与其它软件是否兼容。

      第二种类型的C/S软件要时刻与服务器与连接,比如我的在线网游,QQ聊天工具等。从软件的启动就需要与服务器进行连接,对于此类软件,我们测试环境的重点依然是用户电脑,但服务器端必须也有一个相对应的测试环境支撑。

      对于B/S的系统,我们测试环境的重点就要由用户电脑转为服务器端了,因为系统的所有功能都是由服务器端传递给用户的,所以需要验证服务器传递来的功能是否可用,以及功能的容错能力等。

      再回到测试环境的问题上,对于一些企业为了节约资源,进行功能测试的测试环境,一台服务器可以运行多个系统,通过技术手段可以使系统之间是不会相互影响的(以前公司就是一台服务器上跑多个tomcat)。因为功能测试的重点大于系统对客户端发来的请求是否可以进行正确的处理。

      那么性能测试为什么对系统的环境要求干净、独立呢?性能测试是要对整个系统运行的软件硬件环境进行测试的,如果某环境下运行多个系统,就很难判断其中的某个环境对资源的占用情况。

     

     

    性能测试环境包含内容                                                                          

     

    一般web应用系统分为3层架构(在系统架构一章中有介绍)

    * 表现层(web服务器)

    * 业务逻辑层(应用服务器)

    * 数据层(数据库服务器)

     

    性能测试环境包含内容

    硬件:服务器、客户端、交换机等。

    软件:数据库、中间件、被测系统、操作系统等。

    网络:有线/无线/宽带、网络协议等。

     

     

    如何保证测试环境与真实生产的一致性                                             

     

    保证性能测试与真实生产环境的一致性,具体从以下三个方面来看:

    1、硬件环境,包括服务器环境、与网络环境

      如服务器的型号以及是否和其它应用程序共享此服务器,是否在集群环境下,是否通过BIGIP进行负载均衡,客户使用的硬件配置情况,使用的交换机型号,网络传输速率。

     

    2、软件环境

    版本一致性

      包括包括操作系统、数据库、中间件的版本,被测系统的版本。

    配置一致性

      系统(操作系统/数据库/中间件/被测试系统)参数的配置一致,这些系统参数的配置有可能对系统造成巨大的影响。所以,除了保证测试环境与真实环境所使用的软件版本一致,也要关注其参数的配置是否一致。

     

    3、使用场景的一致性

    基础数据的一致性

      包括预测的业务数据量,以及数据类型的分配。很简单的一个列子,一个系统的数据库只有10条数据和一条数据库里几千万条数据,我们在对其进行性能测试时,得到的性能指标可能会有非常大的差别。

      为了保证每次测试环境的更加一致性,磁盘的使用情况以及磁盘的碎片情况也会或多或少的影响的性能。

    使用模式的一致性

      尽量模拟真实场景下用户的使用情况,其实,我们在做性能测试前期的需求分析,其主要目的也就是为了更真实的模拟用户的使用情况。

     

     

    性能测试环境的实施策略                                                            

     

      上面讲测试环境与生产环境保持一致所需要注意的内容。其实在实际的测试中,我们很难搭建出与生产环境完全一致的一个测试环境,除非我们暂停生产环境用户于进行性能测试,这往往是不可能。一方面某些生产环境是不允许被暂停的,另一方面也为生产环境的安全性考虑。

      性能测试环境并不像功能测试环境,为了节省资源可以一台服务器上运行多个系统。由于性能测试的特殊性,整个测试环境需要在严格的独立监控下管理,在很多情况下,我们很难申请到足够的且一致的资源(说白了就是老板是否愿意出钱给你买服务器搭建系统)。对于一个并未上线的项目,其生产环境的配置也属于暂定状态,性能测试的目的就是为了确定具体生产环境的硬件配置。这个时候更不可能用过高的配置来搭建性能环境(除非现成的环境放着不用)。

    我们一般通过两种策略来搭建性能测试环境(预估方式均有误差)

     

    1、通过建模的方式实现低端硬件对高端硬件的模拟

      通过配置测试来计算不同配置下的硬件性能和系统处理能力的关系,从而推导出满足系统性能的真实配置情况,这种模拟需要精确的建模,模型的采样点越多,那么得到的结果越精确,从而将在低端配置下的性能指标通过该模型转化为高端配置下的最终预计性能指标。

      例如:搭建一个低端环境,首先需要对这个环境的CPU和内存进行单独的性能基准测试,同过在不同的配置的性能测试,得到一个基准信息列表,当然,在进行这个性能测试的过程中,我们要确定硬件是系统的瓶颈。如果只用一个CUP,在性能测试过程中,其使用率很低,但得到的性能数据都非常底,这起码说明CUP不是系统的平静,这种情况下就无法得到想要的基准值。

      如上图,在一颗CPU情况下,运行100个用户且CUP使用率接近饱和(100%)。在增加至两颗CUP的情况下,可以运行190个用户且UPU使用率接近饱和(100%),以此做记录,那么我们就可以推算出运行800个用户需要多少颗CUP。

      如果你在实际应用中使用的CUP型号及其频率并非完全一样,这个时候可以使用EVEREST工具计算每种CUP的得分,对其性能进行评估。

      内存也可以使用此方法进行测试推导,这里需要我们多进行试验,对硬件的性能以及对整个项目的结构都要做深入的了解,以便尽量减少误差。

     

    2、通过集群的方式计算

      对于较大的系统来说,单台服务器的处理能力是有限的,通常都会采用集群的方式来进行负载均衡,完成对海量请求的处理。虽然无法获得整体集群的测试环境,但是可以对集群上的一个节点进行性能测试,得出该节点的处理能力,再计算每增加一个节点的性能损失,同样也可以能过建模的方式得到大型负载均衡情况下的预计性能指标。

      例如:首先在单台服务器上获得具体的性能指标,每台服务器能够承受500用户并发,平均TPS60,响应时间为2秒,接着,添加负载均衡策略,再次测试负载策略下的数据损耗。得出数据后添加1台负载均衡服务器,测试在两台服务器下每台服务器的性能指标,以此类推,可以得到下表:

      随着负载均衡服务器的添加,平均每台服务器的处理能力会逐渐稳定,从而了解在什么情况下需要多少台负载均衡服务器。

      对于测试环境的搭建,建议生成专门的文档进行管理,并进行配置管理,确保对测试环境做到基线控制。

     

    ------------------------------------------

      这个性能测试系列以理论与性能测试的整体讲解为主,市面上的大部分书籍借着性能测试的表皮在讲性能测试工具loadrunner,那我何不找份loadrunner使用手册来看更好。

  • 从架构师类比测试工程师的能力特点

    2014-05-08 16:42:33

    架构师应该具备将复杂问题简单化的能力,将复杂问题抽象化的能力。
    -类比测试:从大量的测试用例中归纳总结提取出某种测试类型的测试框架,利于经验稍少的工程师也能依据你抽象出的测试框架开发出大致质量满足的用例。

    kD*|w`:?X0
    架构师应该具备很广的知识面,不一定要很深入,由于这个角色更倾向于制定全局方向的战略,因此架构师应该有很好的全局观。
    -类比测试:公司级测试架构师要能构建出所在公司的测试技术全局,项目级测试架构师能组合和平衡好项目中各种测试类型,各阶段测试活动,各类测试对象的测试技术应用。

    -M:w2xL,aP[-S0
    架构师必须具备逻辑思维能力,也就是分析问题和解决问题的能力。
    -类比测试:没有足够的分析问题能力,就无法为被测项目进行很好的测试分析,测试对象的提取和风险评估就难做到高质量,会导致后面一系列的测试设计质量和测试活动安排出现偏差。

    XQ'lA'G"w0
    架构师应该具备关联不同知识领域的敏感性,从中受到启发。
    -类比测试:从硬件测试领域获取测试技术灵感和启发,从软件开发领域获得测试解决思路的启发。
    51Testing软件测试网%mx(k]t1W*}0x
    要比别人领先一步去了解一些知识和技术,事先有一个清晰的认识,才能帮助团队其他人。
    -类比测试:资深测试工程师只有具备事先了解学习和评估新测试技术及思想的意义,才能带领测试团队其他成员不断提升测试能力。

    !C5S8?_&q%f-o.JZ P0
    技术架构总是在不断演变的,对于架构师来说,解决问题的思想和思维方式最为重要。有了这样的思想和思考框架,再借助一定的工具,就能把自己的思想转化为解决问题的具体方案。
    -类比测试:被测对象的外部特点和内部结构也总是在变化,测试工程师具有的对测试对象庖丁解牛的分解和提取能力,以及针对性设计开发“打击性”测试用例的测试技术方法,将是长久发展的根本能力。

    |*^`N.`0F8B5L0
    架构师要能“无中生有地建立一个模型”
    -类比测试:被测对象的质量水平如何?我们需要一些模型来评估,性能评估模型,可靠性评估模型,易用性评估模型,兼容性评估模型,这些模型要尽可能的设计得覆盖全面和系统,这些开发各种质量评估模型的能力是测试架构师需要具备的能力之一。
    51Testing软件测试网1r5[fG0bH
    架构师必须足够成熟,因为他们往往需要在无法获得完整信息的情况下,迅速领会问题,并根据经验做成审慎判断,微软内部有能力要求,能把一张比较模糊的图片清晰化。
    -类比测试:任何一个项目的测试,任何一种类型的测试都是在信息不完整下进行分析设计和执行的,因此好的测试人员天生就必须具备在信息不全情况下做判断的能力,不可能去等到信息100%完备才开展工作。虽然我们关于被测对象的信息是不完整的,但是我们的测试活动和对被测系统的认识却必须是清晰的,不能用混沌的系统认识来开展一系列测试活动。

    2e4nGt*j'bf0
    51Testing软件测试网!VER)M8c!Oo
    抽象思维相比具体思维的好处在于:具体思维比较注重细节,也往往会把问题复杂化,使头绪增多而无法收敛。抽象思维能帮助架构师从大量信息、系统文件中,看出一些规律来,并找出与之相关的方面,归纳关键问题。
    -类比测试:测试架构师具有的抽象能力不仅能帮助我们找到测试技术,测试活动当前不足之前的根因,而不是浮在面上的现象。
    51Testing软件测试网;M5LU,SW-g#]Ez6^
    架构师的定位和职责:
     1、架构设计;2、设计评审;3、框架及基础库的开发和维护;4、技术攻关;5、技术传播(培训)6、技术管理;7、技术基础设施构建。
    -类比测试:1、测试用例集架构的设计;2、各类测试设计的评审;3、测试分析设计框架的抽取开发和维护;4、关键测试对象的测试攻关;5、测试技术的培训和辅导;6、对所在项目或公司所有测试技术统一管理和规划;7、测试技术基础设计构建,例如:故障模式库建设,公共可重用的测试用例组件,各种质量属性的测试点积累;
    51Testing软件测试网 D)L!Q?r2Me.[
    架构师从高于代码的抽象角度进行对系统的整体或部分的表达,能对问题域进行尽可能地细化和分解。
    -类比测试:测试架构师的工作要落地为测试用例来体现,但又不能只看到测试用例。要能清楚的知道整个被测系统还需要哪些方面的用例,知道每个用例在所有用例集的唯一价值(避免盲目的用例冗余)。
    51Testing软件测试网 YV$gr IXt]
    通常情况下,架构师的主要工作是分析需求,设计实现架构,并给出设计问题。最宏观的设计视图类似于技术选型,即选择合适的平台,工具,第三方组件。
    -类比测试:分析提取测试对象,设计整个项目的测试策略,给出后续用例设计的指导和约束。基于测试策略来为被测对象选择合适的测试技术组合,测试工具组合。

    G\9uiA*i3_^:W(N0
    当软件规模足够大之后,架构师本身也需要再次分工,此时需要所谓的首席架构师关注系统整体,其他架构师关注各个部分。
    -类比测试:如果公司足够大,可以有1个系统级资深测试工程师来关注公司测试系统的构建和优化,对全部公司的测试技术资源进行统一的整理和规划,了解各领域测试技术的公司现状和业界现状。同时有些资深测试工程师则可以只关注单一领域或几个领域的测试技术,他们比系统级资深测试工程师在单点上认识更深刻,能够在单领域内做更细致的技术规划和技术支持。
    51Testing软件测试网/nti Q)homih8L
    架构师在一定程度上有点像医生,有时会依赖经验和直觉来思考及判定,坚实的代码基础有助于提供判断的正确率。同时,应该不断回顾和重构自己的代码。多做设计练习,给自己一个应用课题,尝试不断地分解、设计。阅读他人的代码,尝试抽取其中的设计。
    -类比测试:测试架构师必如开发架构师一样必须在自己的的专业领域有足够的一线经验积累,丰富的各种测试类型的用例开发经验,各种测试技术应用经验,多个项目的测试分析与设计经验这些基础的一线经验多少将决定他在做测试决策时的判断直觉准确性。同时,我们除了了解自己开发的用例外,还需要广开思路,看他人的测试用例学习其设计思路,学习外界的各类测试技术和测试思想,就如软件开发人员阅读优秀代码和学习优秀架构,从中吸取自己专业的优秀设计经验。
    51Testing软件测试网Tl0h!P)f
    沟通力是架构师最重要的基本技能之一,沟通力不仅仅是能协调能说,更重要的是想的清楚和说的清楚。例如:尽管我可能知道我想要做什么,或把某件事做成什么样子,但我没法用语言系统化的表达。因为系统化的表达必须先基于一个系统工程,这也是一个需要训练的过程。无论你把它理解成为抽象能力也好,洞察能力也罢,今天的知识工作者所面临的重要问题就是抽象、归纳与描述。
    -类比测试:所有的测试活动不是只依赖拍脑袋和头脑风暴,我们还需要掌握一些系统化的工程方法,并在测试分析设计的早期活动中以系统化的工作方式来开展工作。

    px TlF!{9B0
    在一次调查中架构师能力的反馈结果为:
    TOP1: 沟通能力;NO.2: 抽象能力; NO.3:规划能力;NO.4 决策能力; NO.5控制能力;NO.6平衡力;
    -类比测试:如上点评,要做好测试架构师或资深测试工程师同样需要具备如上6种能力
  • 网站性能工具Yslow的使用方法

    2013-12-23 10:34:03

    Yslow是雅虎开发的基于网页性能分析浏览器插件,从年初我使用了YSlow后,改变了博客模板大量冗余代码,不仅提升了网页的打开速度,这款插件还帮助我分析了不少其他网站的代码,之前我还特意写了提高网站速度的秘籍,就是通过这款插件分析得出的。网络上已经有不少Yslow使用说明了,本文我想介绍下我使用Yslow的方法和一些别人没提到的小技巧。

    Yslow的安装方法

    现在Yslow已经有很多版本了,本文介绍的是3.0.4最新版,打开Yslow官网就能看到有四个版本可供选择:火狐(firefox)浏览器、谷歌(chrome)浏览器、欧朋(opera)浏览器和移动版。

    安装Yslow要先安装 Firebug(本地址以火狐为例),两种方法启动Yslow:1、打开Firebug窗口,选择Yslow选项。2、直接点击火狐右下角的Yslow启动按钮。

    Yslow的启动界面

    (图1:Yslow的启动界面)

    点击 Run Test 运行Yslow,也可以点击 Grade, Components, 或Statistics选项开始对页面的分析,如果在 Autorun YSlow each time a web page is loaded 上打上对勾,它将自动对以后打开页面进行分。

    注意图中的红框,这里是规则集,YSlow (V2)包含了所有22个测试的规则,YSlow (V1)包含原始13规则,小网站或博客-这个规则集包含14个规则,适用于小型网站或博客,建议对号入座。

    雅虎评估网站性能的23条军规

    雅虎曾经针对网站速度提出了非常著名34条准则:《Best Practices for Speeding Up Your Web Site》。而现在将34条精简为更加直观的23条,并针对每一条给出从F~A的评分以及最终的总分。

    而现在23条网站性能优化建议在YSlow的官网首页就能看到,当然也可以不看,在使用Yslow后,在控制面板里就会给你评分提示,和改进建议。

    Grade(等级视图)—Yslow的第二个选项卡

    YslowGrade(等级视图)给出的网站性能评分

    (图2:Yslow给出的网站性能评分)

    Yslow给出的网站性能评分,从F~A,A是最好的,通过测试卢松松博客来看,网站有4处得分最低,例如图2中的最低分提示:我博客的HTTP请求太多。其中应用了14个外部JS、3个CSS文件(之前我已从6个合并为3个)、14个CSS背景图片。

    Yslow的建议是让我合并这些,至于合并CSS引用图片我在“提高网站打开速度的7大秘籍”中介绍过。

    Components(组件视图)—Yslow的第三个选项卡

    通过Components考验查看网页各个元素占用的空间大小

    (图3:通过Components考验查看网页各个元素占用的空间大小)

    通过Components考验查看网页各个元素占用的空间大小,例如我博客某个页面,有236个images(图片),占用了489.2K,通过详细查看,发现来自gravatar(评论头像)的引用图片非常大,在加上我博客本省评论量就打,每个头像就占用几K,几百个就占用了整个网页50%的大小,而且图片还是引用的,加载就更慢。

    所以,我得出的结论是:gravatar虽然增强了互动性和个性,但也结结实实影响了网站速度。

    Statistics(统计信息视图)—Yslow的第四个选项卡

    Yslow的统计信息视图

    (图4:Yslow的统计信息视图)

    左侧图表显示是页面元素在空缓存的加载情况,右侧为页面元素使用缓存后的页面加载情况。从图中可以直观的看出(尤其是我标的红框),这个网页263个HTTP请求,网页的大小达到773.9K,意味着打开没打开一个页面几乎需要下载1M的东西,而通过使用缓存后我们可以看到效果图片基本靠缓存,而网页的总大小压缩到43.2K。

    Statistics这个统计信息视图工具和Components(第三选项卡)一样,只是效果更直观,如果要获得性能优化建议还是要看Grade(第二选项卡)的详细建议。

    Tools(辅助工具)—Yslow的第五个选项卡

    Yslow提供的小工具

    (图5:Yslow提供的小工具)

    JSLint是一个强大的工具,它可以检验HTML代码以及内联的Javascript代码,通过JSLint发现了google analytics上的一个js错误。

    ALL JS:查看你这个网页上一共引用了多少JS。

    All JS Beautified:把所有JS放在打开的页面中,利用站长统一检查(我感觉作用不大)。

    All JS Minified:同上,但它显示的是压缩过的js代码,如果你要JS优化,它已经给你优化好了,来过来直接用。

    All CSS:显示你网页所有CSS文件。

    YUI CSS Compressor:显示网页压缩后的CSS文件,也是拿过来可以直接用的。

    All Smush.it™:图片在线优化网站,点击它后会自动跳到smushit网站上给你自动优化CSS图片,该网站提供了优化前与优化后的对比,点击直接下载优化后的图片,在覆盖到自己网站上就可以了,强烈推荐。

    Printable View:这个是打印用的,部门开会、前端设计师讨论、向老板汇报时估计用的上。

  • Web性能优化方案

    2013-12-18 15:32:48

    第一章 打开网站慢现状分析

    在公司访问部署在IDC机房的VIP网站时会感觉很慢。是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上。

           可以跟踪一下我们的登录页面,如下图所示

        从上图我们可以分析知道,HTML文档只占了总响应时间的20%,其它80%响应时间用来下载JSCSS、图片等组件。所以WEB前端有很大的优化空间,我们将从WEB的前端优化、后端优化两方面综合考虑给出WEB的性能优化方案。

     

    一、尽量减少 HTTP 请求

    HTTP

    1 合并脚本跟样式文件,如可以把多个 CSS 文件合成一个,把多个 JS 文件合成一个。

    2 CSS Sprites 利用 CSS background 相关元素进行背景图绝对定位,把多个图片合成一个图片。

     

    二、使用浏览器缓存

           在用户浏览网站的不同页面时,很多内容是重复的,比如相同的JSCSS、图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件,将大大降低页面产生的流量,从而降低页面载入时间。

       根据服务器端的响应header,一个文件对浏览器而言,有几级不同的缓存状态。

       1、服务器端告诉浏览器不要缓存此文件,每次都到服务器上更新文件。

       2、服务器端没有给浏览器任何指示。

       3、在上次传输中,服务器给浏览器发送了Last-ModifiedEtag数据,再次浏览时浏览器将提交这些数据到服务器,验证本地版本是否最新的,如果为最新的则服务器返回304代码,告诉浏览器直接使用本地版本,否则下载新版本。一般来说,有且只有静态文件,服务器端才会给出这些数据。

       4、服务器强制要求浏览器缓存文件,并设置了过期时间。在缓存未到期之前,浏览器将直接使用本地缓存文件,不会与服务器端产生任何通信。

           我们要做的是尽量强制浏览器到第四种状态,特别是对于JSCSS、图片等变动较少的文件。

     

    三、使用压缩组件

    IEFirefox浏览器都支持客户端GZIP,传输之前,先使用GZIP压缩再传输给客户端,客户端接收之后由浏览器解压,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更高的带宽利用率。对于纯文本来讲,压缩率是相当可观的。如果每个用户节约50%的带宽,那么租用来的那点带宽就可以服务多一倍的客户,并且缩短了数据的传输时间。

     

    四、图片、JS的预载入

    预载入图像最简单的方法是在 JavaScript. 中实例化一个新 Image() 对象,然后将需要载入的图像的 URL 作为参数传入。

    function preLoadImg(url) {

    var img = new Image();

    img.src = url;

    }

    可以在登录页面预载入JS和图片

     

    五、将脚本放在底部

    脚本放在顶部带来的问题,

    1、  使用脚本时,对于位于脚本以下的内容,逐步呈现将被阻塞

    2、  在下载脚本时会阻塞并行下载

    放在底部可能会出现JS错误问题,当脚本没加载进来,用户就触发脚本事件。

    要综合考虑情况。

     

    六、将样式文件放在页面顶部

    如果样式表任在加载,构建呈现树就是一种浪费,样式文件放在页面底部可能会出现两种情况:

    1、  白屏

    2、  无样式内容的闪烁

     

    七、使用外部的JSCSS

    将内联的JSCSS做成外部的JSCSS。减少重复下载内联的JSCSS

     

    八、切分组件到多个域

     

     

     

    第四章 数据库的优化

    附录A 页面请求分析

      从输入URL到页面呈现需要下面5个步骤

    1 输入URL地址或者点击URL的一个链接

     2 浏览器根据URL地址,结合DNS,解析出URL对应的IP地址

     3 发送HTTP请求

     4 开始连接请求的服务器并且请求相关的内容

     5 浏览器解析从服务器端返回的内容,并且把页面显现出来

     

    上面基本上就是一个页面从请求到实现的基本过程,下面我们将剖析这个过程。

     

    当输入URL之后,浏览器就要知道这个URL对应的IP是什么,只有知道了IP地址,浏览器才能准备的把请求发送到指定的服务器的具体IP和端口号上面。浏览器的DNS解析器负责把URL解析为正确的IP地址。这个解析的工作是要花时间的,而且这个解析的时间段内,浏览器不是能从服务器那里下载到任何的东西的。浏览器和操纵系统提供了DNS解析缓存支持。

     

    当获得了IP地址之后,那么浏览器就向服务器发送HTTP的请求,过程如下:

    1.浏览器通过发送一个TCP的包,要求服务器打开连接

    2.服务器也通过发送一个包来应答客户端的浏览器,告诉浏览器连接开了。

    3.浏览器发送一个HTTPGET请求,这个请求包含了很多的东西了,例如我们常见的cookie和其他的head头信息。

    这样,一个请求就算是发过去了。

     

    请求发送去之后,之后就是服务器的事情了,服务器端的程序把最后的结果发送到客户端。

      其实首先到达浏览器的就是html的那些文档,所谓的html的文档,就是纯粹的html代码,不包含什么图片,脚本,CSS等的。也就是页面的html结构。因为此时返回的只是页面的html结构。这个html文档的发送到浏览器的时间是很短的,一般是占整个响应时间的10%左右。

      这样之后,那么页面的基本的骨架就在浏览器中了,下一步就是浏览器解析页面的过程,也就是一步步从上到下的解析html的骨架了。

    如果此时在html文档中,遇到了img标签,那么浏览器就会发送HTTP请求到这个img响应的URL地址去获取图片,然后呈现出来。如果在html文档中有很多的图片,flash,那么浏览器就会一个个的请求,然后呈现,如果每个图片都要请求,那么就要进行之前说的那些步骤:解析url,打开tcp连接等等。打开连接也是要消耗资源的,就像我们在进行数据库访问一样,我们也是尽可能的少开数据库连接,多用连接池中的连接。道理一样,tcp连接也是可以重用的。http1.1提出了持久连接(persistent connection)的概念,也就是说同一条 HTTP 连接,可以同时处理多个请求,减少tcp连接。

    当页面的html骨架载入了之后,浏览器就开始解析页面中标签,从上到下开始解析。

    首先是head标签的解析,如果发现在head中有要引用的JS脚本,那么浏览器此时就开始请求脚本,此时整个页面的解析过程就停了下来,一直到JS请求完毕。之后页面接着向下解析,如解析body标签,如果在body中有img标签,那么浏览器就会请求imgsrc对应的资源,如果有多个img标签,那么浏览器就一个个的解析,解析不会像JS那样等待的,会并发的下载。

  • http 错误代码表

    2013-12-18 14:10:05

    所有 HTTP 状态代码及其定义。
     代码  指示  
    2xx  成功  
    200  正常;请求已完成。  
    201  正常;紧接 POST 命令。  
    202  正常;已接受用于处理,但处理尚未完成。  
    203  正常;部分信息 — 返回的信息只是一部分。  
    204  正常;无响应 — 已接收请求,但不存在要回送的信息。  
    3xx  重定向  
    301  已移动 — 请求的数据具有新的位置且更改是永久的。  
    302  已找到 — 请求的数据临时具有不同 URI。  
    303  请参阅其它 — 可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。  
    304  未修改 — 未按预期修改文档。  
    305  使用代理 — 必须通过位置字段中提供的代理来访问请求的资源。  
    306  未使用 — 不再使用;保留此代码以便将来使用。  
    4xx  客户机中出现的错误  
    400  错误请求 — 请求中有语法问题,或不能满足请求。  
    401  未授权 — 未授权客户机访问数据。  
    402  需要付款 — 表示计费系统已有效。  
    403  禁止 — 即使有授权也不需要访问。  
    404  找不到 — 服务器找不到给定的资源;文档不存在。  
    407  代理认证请求 — 客户机首先必须使用代理认证自身。  
    415  介质类型不受支持 — 服务器拒绝服务请求,因为不支持请求实体的格式。  
    5xx  服务器中出现的错误  
    500  内部错误 — 因为意外情况,服务器不能完成请求。  
    501  未执行 — 服务器不支持请求的工具。  
    502  错误网关 — 服务器接收到来自上游服务器的无效响应。  
    503  无法获得服务 — 由于临时过载或维护,服务器无法处理请求。
    -----------------------------------------------------------------------------------------------------------------------
    HTTP 400 - 请求无效 
    HTTP 401.1 - 未授权:登录失败 
    HTTP 401.2 - 未授权:服务器配置问题导致登录失败 
    HTTP 401.3 - ACL 禁止访问资源 
    HTTP 401.4 - 未授权:授权被筛选器拒绝 
    HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败  
    HTTP 403 - 禁止访问 
    HTTP 403 - 对 Internet 服务管理器 (HTML) 的访问仅限于 Localhost 
    HTTP 403.1 禁止访问:禁止可执行访问 
    HTTP 403.2 - 禁止访问:禁止读访问 
    HTTP 403.3 - 禁止访问:禁止写访问 
    HTTP 403.4 - 禁止访问:要求 SSL 
    HTTP 403.5 - 禁止访问:要求 SSL 128 
    HTTP 403.6 - 禁止访问:IP 地址被拒绝 
    HTTP 403.7 - 禁止访问:要求客户证书 
    HTTP 403.8 - 禁止访问:禁止站点访问 
    HTTP 403.9 - 禁止访问:连接的用户过多 
    HTTP 403.10 - 禁止访问:配置无效 
    HTTP 403.11 - 禁止访问:密码更改 
    HTTP 403.12 - 禁止访问:映射器拒绝访问 
    HTTP 403.13 - 禁止访问:客户证书已被吊销 
    HTTP 403.15 - 禁止访问:客户访问许可过多 
    HTTP 403.16 - 禁止访问:客户证书不可信或者无效 
    HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效 
    HTTP 404.1 - 无法找到 Web 站点 
    HTTP 404 - 无法找到文件 
    HTTP 405 - 资源被禁止 
    HTTP 406 - 无法接受 
    HTTP 407 - 要求代理身份验证 
    HTTP 410 - 永远不可用 
    HTTP 412 - 先决条件失败 
    HTTP 414 - 请求 - URI 太长 
    HTTP 500 - 内部服务器错误 
    HTTP 500.100 - 内部服务器错误 - ASP 错误 
    HTTP 500-11 服务器关闭 
    HTTP 500-12 应用程序重新启动 
    HTTP 500-13 - 服务器太忙 
    HTTP 500-14 - 应用程序无效 
    HTTP 500-15 - 不允许请求 global.asa 
    Error 501 - 未实现 
    HTTP 502 - 网关错误 
  • JMeter基础之—录制脚本

    2013-12-17 14:41:37

    Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细;很它的优点也有很多:

      l       开源,他是一款开源的免费软件,使用它你不需要支付任何费用,

      l       小巧,相比LR的庞大(最新LR11将近4GB),它非常小巧,不需要安装,但需要JDK环境,因为它是使用java开发的工具。

          l       功能强大,jmeter设计之初只是一个简单的web性能测试工具,但经过不段的更新扩展,现在可以完成数据库、FTPLDAPWebService等方面的测试。因为它的开源性,当然你也可以根据自己的需求扩展它的功能。

    我觉得它更像一个瑞士军刀,小巧,且功能齐全。初次认识Jmeter的时候,我觉得它不好,是因为相比LR来说,它没有脚本录制功能,也许不是没有,只是我不知道,因为文档上介绍的是这样,我要做一个web性能测试的话,就手动的一个个添加循环控制器、http信息管理头、http请求等等各种元件。如果测试的脚本较多时,这无疑是个体力活。

           Badboy是一款不错web自动化测试工具,利用它来录制脚本,并且录制的脚本可以直接保存为JMeter文件来使用。我无疑给我们带来了很大我方便。

    ----------------------我的环境------------

    Badboy  version 2.1.1

    Apache  JMeter-2.3.4 (需要JDK环境来运行)

    --------------------------------------------

    第一种方法:通过bodboy来录制脚本。

     

    1.打开人badboy工具,点击工栏目上的红色圆形按钮,在地址栏目中输入被测试项目的地址。

     

    录制完成后,点击工具栏旁边黑色按钮,结束录制。

    选择“文件”--àExport to Jmeter…

     

     

     

    2.打开Jmeter工具,选择“文件”-->“打开”选择刚才保存的文件(.jmx类型),将文件导入进来了。

     

     

     

    第二种方法,通过JMeter自身设置来录制脚本。

     

    这种方法是我才发现的(鄙视一下自己的无知,嘻嘻~!),觉得方法比较简单。 

    1.       打开JMeter工具

    创建一个线程组(右键点击“测试计划”--->“添加”---->“线程组”)

    创建一个http代理服务器(右键点击“工作台”--->“添加”--->“非测试元件”--->“http代理服务器”

    完整的设置参照下图:

     

    2.  下面来设置一下IE浏览器

    IE--->“internet属性”--->“连接”--->“局域网设置”

    设置为本机IP就可以了,注意端口号要与Jmeter上的端口号一致。默认都是8080端口。

    3.   现在点击jmeter上的“启动”按钮,打开浏览器输入需要录制web项目地址,jmeter会自动记录你IE所访问的页面。

    PS:第二种方法是我刚才知道的一种,关于这两种方法哪个更好,现在还不知道,但第二方法有通过IE浏览器辅助的,我想可能只要IE能打开的,它都能记录,但它录制的脚本看上去比较乱(感觉上)

    还就是http代理服务器的设置,(比如:分组:每一个组放入一个新的服务器---只有这一个选项才能正常录制),有时间再仔细比较一下两种方法的不同之处。

  • Jmeter安装

    2013-12-16 15:12:05

    解压jakarta-jmeter-2.2.zip文件至c盘,本文解压至C:\\jakarta-jmeter-2.2目录下。
    桌面上选择“我的电脑”(右键),高级, 环境变量, 在“系统变量”--->“新建”, 在变量名中输入:JMETER_HOME,变量值中输入:C:\jakarta-jmeter-2.2 ,再修改CLASSPATH变量,变量 值 中 添 加 %JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%  JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar; 然后确定即 可。
    然后点击Jmeter目录下bin文件夹里的jmeter.bat就可以打开Jmeter
     
  • 利用 mount 指令解决 Read-only file system的问题

    2013-12-09 09:54:14

    今天开机不知道为什么不能直接进入图像界面,只能输入root的密码进入根用户,是Read-only file System,无法修改任何文件,也不能用startx进入图形界面。结果上网找到了临时的解决办法


    chmod 666 /dev/null
    mount -o remount,rw /


    在reboot重启就可以,具体原因还不知道。不过上面两行估计就是改变系统所有文件的权限的命令。后来上网查了一下,老问题一个,第一个命令好像不用都可以。
    可是进入了图形界面,还是不能保存东西。(提示“You are trying to save the file on a read-only disk. Please check that you typed the location correctly and try again.”)而且Terminal还是灰色屏,不能些东西,Alt+F2也没用。机子上不能保存,就保存在这上面。


    附挂载分区命令():
    分区挂载
    sudo mount -t 文件系统类型 设备路经 访问路经
    #常用文件类型如下: iso9660 光驱文件系统, vfat fat/fat32分区, ntfs ntfs分区, smbfs windows网络共享目录, reiserfs、ext3、xfs Linux分区
    #如果中文名无法显示尝试在最後增加 -o nls=utf8 或 -o iocharset=utf8
    #如果需要挂载後,普通用户也可以使用,在 -o 的参数後面增加 ,umask=022 如:-o nls=utf8,umask=022

    分区卸载
    sudo umount 目录名或设备名

    只读挂载ntfs分区
    sudo mount -t ntfs -o nls=utf8,umask=0 /dev/sdb1 /mnt/c

    可写挂载ntfs分区
    sudo mount -t ntfs-3g -o locale=zh_CN.utf8,umask=0 /dev/sdb1 /mnt/

    挂载fat32分区
    sudo mount -t vfat -o iocharset=utf8,umask=0 /dev/sda1 /mnt/c

    挂载共享文件
    sudo mount -t smbfs -o  username=xxx,password=xxx,iocharset=utf8 //192.168.1.1/share /mnt/share

    挂载ISO文件
    sudo mount -t iso9660 -o loop,utf8 xxx.iso /mnt/iso

    安装xp后修复grub可在/boot/grub/menu.lst后面添加
    title        Microsoft Windows XP Professional
    rootnoverify    (hd0,0) //此处写入Windows操作系统安装在硬盘的位置,(hd0,0)表示第一块硬盘的第一个分区
    savedefault
    makeactive
    chainloader    +1

  • WEB安全测试要考虑的10个测试点

    2013-11-27 15:38:33

    本文主要论述了WEB安全测试要考虑的10个测试点:

    1、问题:没有被验证的输入

    测试方法:

    数据类型(字符串,整型,实数,等)

    允许的字符集

    最小和最大的长度

    是否允许空输入

    参数是否是必须的

    重复是否允许

    数值范围

    特定的值(枚举型)

    特定的模式(正则表达式)

    2、问题:有问题的访问控制

    测试方法:

    主要用于需要验证用户身份以及权限的页面,复制该页面的url地址,关闭该页面以后,查看是否可以直接进入该复制好的地址

    例:从一个页面链到另一个页面的间隙可以看到URL地址

    直接输入该地址,可以看到自己没有权限的页面信息,

    3、错误的认证和会话管理

    例:对Grid、Label、Tree view类的输入框未作验证,输入的内容会按照html语法解析出来

    4、缓冲区溢出

    没有加密关键数据

    例:view-source:http地址可以查看源代码

    在页面输入密码,页面显示的是 *****, 右键,查看源文件就可以看见刚才输入的密码。

    5、拒绝服务

    分析:攻击者可以从一个主机产生足够多的流量来耗尽狠多应用程序,最终使程序陷入瘫痪。需要做负载均衡来对付。

    6、不安全的配置管理

    分析:Config中的链接字符串以及用户信息,邮件,数据存储信息都需要加以保护

    程序员应该作的: 配置所有的安全机制,关掉所有不使用的服务,设置角色权限帐号,使用日志和警报。

    分析:用户使用缓冲区溢出来破坏web应用程序的栈,通过发送特别编写的代码到web程序中,攻击者可以让web应用程序来执行任意代码。

    7、注入式漏洞

    例:一个验证用户登陆的页面,

    如果使用的sql语句为:

    Select * from table A where username=’’ + username+’’ and pass word …..

    Sql 输入 ‘ or 1=1 ―― 就可以不输入任何password进行攻击

    或者是半角状态下的用户名与密码均为:‘or’‘=’

    8、不恰当的异常处理

    分析:程序在抛出异常的时候给出了比较详细的内部错误信息,暴露了不应该显示的执行细节,网站存在潜在漏洞,

    9、不安全的存储

    分析:帐号列表:系统不应该允许用户浏览到网站所有的帐号,如果必须要一个用户列表,推荐使用某种形式的假名(屏幕名)来指向实际的帐号。

    浏览器缓存:认证和会话数据不应该作为GET的一部分来发送,应该使用POST,

    10、问题:跨站脚本(XSS)

    分析:攻击者使用跨站脚本来发送恶意代码给没有发觉的用户,窃取他机器上的任意资料

    测试方法:

    ● HTML标签:<…>…</…>

    ● 转义字符:&(&);<(<);>(>); (空格) ;

    ● 脚本语言:

    <script. language=‘javascript’>

    …Alert(‘’)

    </script>

    ● 特殊字符:‘ ’ < > /

    ● 最小和最大的长度

    ● 是否允许空输入

  • 性能监控之监控SQL语句

    2013-09-29 09:42:52


    分析表
    analyze table tablename compute statistics for all indexes;
    analyze table tablename compute statistics for all indexed columns;
    analyze table tablename compute statistics for table;

    监控事例的等待

    select event,sum(decode(wait_Time,0,0,1)) "Prev",
    sum(decode(wait_Time,0,1,0)) "Curr",count(*) "Tot"
    from v$session_Wait
    group by event order by 4;

    查看碎片程度高的表

    SELECT segment_name table_name , COUNT(*) extents
    FROM dba_segments WHERE owner NOT IN (SYS, SYSTEM) GROUP BY segment_name
    HAVING COUNT(*) = (SELECT MAX( COUNT(*) FROM dba_segments GROUP BY segment_name);

    表、索引的存储情况检查

    select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
    tablespace_name=&tablespace_name and segment_type=TABLE group by tablespace_name,segment_name;

    select segment_name,count(*) from dba_extents where segment_type=INDEX and wner=&owner
    group by segment_name;

    找使用CPU多的用户session

    12是cpu used by this session

    select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
    from v$session a,v$process b,v$sesstat c
    where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;

    监控表空间的 I/O 比例

    select df.tablespace_name name,df.file_name "file",f.phyrds pyr,
    f.phyblkrd pbr,f.phywrts pyw, f.phyblkwrt pbw
    from v$filestat f, dba_data_files df
    where f.file# = df.file_id
    order by df.tablespace_name;


    回滚段的争用情况

    select name, waits, gets, waits/gets "Ratio"
    from v$rollstat a, v$rollname b
    where a.usn = b.usn;

    在某个用户下找所有的索引

    select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
    from user_ind_columns, user_indexes
    where user_ind_columns.index_name = user_indexes.index_name
    and user_ind_columns.table_name = user_indexes.table_name
    order by user_indexes.table_type, user_indexes.table_name,
    user_indexes.index_name, column_position;


    监控文件系统的 I/O 比例

    select substr(a.file#,1,2) "#", substr(a.name,1,30) "Name",
    a.status, a.bytes, b.phyrds, b.phywrts
    from v$datafile a, v$filestat b
    where a.file# = b.file#;

    监控 SGA 中字典缓冲区的命中率

    select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
    (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
    from v$rowcache
    where gets+getmisses <>0
    group by parameter, gets, getmisses;

    监控 SGA 中共享缓存区的命中率,应该小于1%

    select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
    sum(reloads)/sum(pins) *100 libcache
    from v$librarycache;

    select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
    from v$librarycache;

    监控 SGA 的命中率

    select a.value + b.value "logical_reads", c.value "phys_reads",
    round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
    from v$sysstat a, v$sysstat b, v$sysstat c
    where a.statistic# = 38 and b.statistic# = 39
    and c.statistic# = 40;

    监控 SGA 中重做日志缓存区的命中率,应该小于1%

    SELECT name, gets, misses, immediate_gets, immediate_misses,
    Decode(gets,0,0,misses/gets*100) ratio1,
    Decode(immediate_gets+immediate_misses,0,0,
    immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
    FROM v$latch WHERE name IN (redo allocation, redo copy);

    显示所有数据库对象的类别和大小

    select count(name) num_instances ,type ,sum(source_size) source_size ,
    sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size,
    sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
    from dba_object_size
    group by type order by 2;

    监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size

    SELECT name, value FROM v$sysstat WHERE name IN (sorts (memory), sorts (disk));


    监控当前数据库谁在运行什么SQL语句

    SELECT osuser, username, sql_text from v$session a, v$sqltext b
    where a.sql_address =b.address order by address, piece;

    监控字典缓冲区

    SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
    SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE;
    SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE;

    后者除以前者,此比率小于1%,接近0%为好。

    SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
    FROM V$ROWCACHE

    监控 MTS

    select busy/(busy+idle) "shared servers busy" from v$dispatcher;

    此值大于0.5时,参数需加大

    select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type=dispatcher;
    select count(*) from v$dispatcher;
    select servers_highwater from v$mts;

    servers_highwater接近mts_max_servers时,参数需加大

    碎片程度

    select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name
    having count(tablespace_name)>10;

    alter tablespace name coalesce;
    alter table name deallocate unused;

    create or replace view ts_blocks_v as
    select tablespace_name,block_id,bytes,blocks,free space segment_name from dba_free_space
    union all
    select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;

    select * from ts_blocks_v;

    select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space
    group by tablespace_name;
  • oracle-日常维护常用的55条语句

    2013-09-29 09:23:51

    数据库 1.如何查看数据库的状态
       unix下
    ps -ef | grep ora
    windows下
    看服务是否起来
    是否可以连上数据库
    SQL&gt; select status, instance_role from v$instance;
    通过此语句可以核查数据库是否出于open状态
    2.如何查有多少个数据库实例
      SQL&gt;SELECT * FROM V$INSTANCE;
    3.怎样查得数据库的SID
    select name from v$database;
    也可以直接查看 init.ora文件
    4.查看表空间占用情况
    select  b.file_id  file_ID,  b.tablespace_name  tablespace_name, b.bytes  Bytes,  (b.bytes-sum(nvl(a.bytes,0)))  used, sum(nvl(a.bytes,0))  free, sum(nvl(a.bytes,0))/(b.bytes)*100         Percent   from dba_free_space a,dba_data_files b  where a.file_id=b.file_id  group by b.tablespace_name,b.file_id,b.bytes   order by b.file_id;
    5如何.获取表空间信息
    select * from dba_tablespaces(或者v$tablespace);
    6.如何改变表空间的大小
    通过手动改变数据文件大小来改变表空间大小:
     Alter database datafile ‘/opt/oracle/data/datafilename.dbf’ resize 500m;
    通过在表空间中增加数据文件来改变表空间大小:
     Alter tablespace tablespace_name add datafile ‘opt/oracle/data/newdatafile.dbf’ size 300m;
    7.如何增加临时表空间大小
    如果原来的用户缺省临时表空间大小不够,此时首先用如下语句创建一足够大的临时表空间:
     CREATE TEMPORARY TABLESPACE temp
      TEMPFILE '/u01/oradata/temp01.dbf' SIZE 500M
      EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 10M;
    然后用如下语句改变用户的缺省临时表空间:
     alter user username temporary tablespace new_temporary_tablespace_name;
    8. 如何查看数据文件的信息
       数据文件信息:
       Select * from dba_data_files(v$datafile);
          临时数据文件信息:
       Select * from dba_temp_files(v$tempfile)
    9.如何将表移动之表空间
    ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;
    10.如何查看回滚段名称及大小
      select segment_name, tablespace_name, r.status,
    (initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
    max_extents, v.curext CurExtent
    From dba_rollback_segs r, v$rollstat v
    Where r.segment_id = v.usn(+)
    order by segment_name ;
    11.如何察看回滚段竞争情况
       Select * from v$undostat;
      返回结果中nospaceerrcnt字段的值应该为0,如果持续出现非0,建议增加回滚段表空间大小.
    12.如何查看控制文件.
       select name from v$controlfile;
    13.如何查看日志文件
    select member from v$logfile;
    14.如何查看日志文件的切换时间
     SQL&gt;select to_char(first_time,'yyyy-mm-dd hh24:mi:ss') change_time from v$log_history;
    15.查看数据库版本
    select * from v$version
    16.查看会话情况
       select machine,terminal from v$session;
    17.如何查看系统最大会话数
       Select * from v$parameter where name like ‘proc%’
       Show parameter processes
       Select * from v$license
    18. 如何查看系统被锁的事务时间
       select * from v$locked_object
    19.查看数据库的创建日期和归档方式
    select created,log_mode,log_mode from v$database
    20.如何以archivelog的方式运行oracle
       init.ora
    log_archive_start = true
    RESTART DATABASE
    21.如何获取有哪些用户在使用数据库
    select username from v$session;
    22.如何显示当前连接用户
        SHOW  USER
    23.如何获取用户相关信息
    Select * from dba_users(dba_ts_quotas);
    从结果中可以查看用户的缺省临时表空间等信息.
    24.如何查看每个用户的权限
    SELECT *  FROM DBA_SYS_PRIVS;
    25. 如何知道使用CPU多的用户session
      11是cpu used by this session
       select a.sid,spid,status,substr(a.program,1,40)prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=11 and c.sid=a.sid and a.paddr=b.addr order by value desc;
    26.unix 下怎么调整数据库的时间?
    su -root
    date -u 08010000
    27.如何查看当前数据库里锁的情况
       以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:
    select object_id,session_id,locked_mode from v$locked_object;
    select t2.username,t2.sid,t2.serial#,t2.logon_time
    from v$locked_object t1,v$session t2
    where t1.session_id=t2.sid order by t2.logon_time;如果有长期出现的一列,可能是没有释放的锁。我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
    alter system kill session 'sid,serial#';
    如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
    28.如何解锁
    ALTER SYSTEM KILL SESSION  ‘SID,SERIR#’;
    29.如何获取错误信息
      SELECT *  FROM  USER_ERRORS;
    30.如何获取连接状况
    Select  * from  DBA_DB_LINKS;

  • JAVA中Get和Post请求的区别收集整理

    2013-09-26 10:15:09

    1. get 是从服务器上获取数据,post 是向服务器传送数据。 get 请求返回 request - URI 所指出的任意信息。
    Post 请求用来发送电子邮件、新闻或发送能由交互用户填写的表格。这是唯一需要在请求中发送body的请求。使用Post请求时需要在报文首部 Content - Length 字段中指出body的长度。
    2. get 是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址,用户看不到这个过程。
    3. 对于 get 方式,服务器端用Request.QueryString获取变量的值,对于 post 方式,服务器端用Request.Form获取提交的数据。
    4. get 传送的数据量较小,不能大于2KB。post 传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 用IIS过滤器的只接受get参数,所以一般大型搜索引擎都是用get方式。
    5. get 安全性非常低,post 安全性相对较高。如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post 为好。
  • Oracle-常用监控SQL

    2013-09-25 15:59:04

    1.监控事例的等待:
    select event,sum(decode(wait_time,0,0,1)) PRev, sum(decode(wait_time,0,1,0)) curr,count(*)
    from v$session_wait
    group by event order by 4;
    2.回滚段的争用情况:
    select name,waits,gets,waits/gets ratio from v$rollstat a,v$rollname b where a.usn=b.usn;
    3.监控表空间的I/O比例:
    select df.tablespace_name name,df.file_name "file",f.phyrds pyr,f.phyblkrd pbr,f.phywrts pyw,
    f.phyblkwrt pbw
    from v$filestat f,dba_data_files df
    where f.file#=df.file_id
    4.监空文件系统的I/O比例:
    select substr(a.file#,1,2) "#",substr(a.name,1,30) "name",a.status,a.bytes,
    b.phyrds,b.phywrts
    from v$datafile a,v$filestat b
    where a.file#=b.file#
    5.在某个用户下找所有的索引:
    select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name
    from user_ind_columns, user_indexes
    where user_ind_columns.index_name = user_indexes.index_name
    and user_ind_columns.table_name = user_indexes.table_name
    order by user_indexes.table_type, user_indexes.table_name,
    user_indexes.index_name, column_position;
    6. 监控 SGA 的命中率 select a.value + b.value "logical_reads", c.value "phys_reads",
    round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) "BUFFER HIT RATIO"
    from v$sysstat a, v$sysstat b, v$sysstat c
    where a.statistic# = 38 and b.statistic# = 39
    and c.statistic# = 40;

    7. 监控 SGA 中字典缓冲区的命中率 select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio",
    (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio"
    from v$rowcache
    where gets+getmisses <>0
    group by parameter, gets, getmisses;

    8. 监控 SGA 中共享缓存区的命中率,应该小于1%

    select sum(pins) "Total Pins", sum(reloads) "Total Reloads",
    sum(reloads)/sum(pins) *100 libcache
    from v$librarycache; select sum(pinhits-reloads)/sum(pins) "hit radio",sum(reloads)/sum(pins) "reload percent"
    from v$librarycache;

    9. 显示所有数据库对象的类别和大小 select count(name) num_instances ,type ,sum(source_size) source_size ,
    sum(parsed_size) parsed_size ,sum(code_size) code_size ,sum(error_size) error_size,
    sum(source_size) +sum(parsed_size) +sum(code_size) +sum(error_size) size_required
    from dba_object_size
    group by type order by 2;

    10. 监控 SGA 中重做日志缓存区的命中率,应该小于1% SELECT name, gets, misses, immediate_gets, immediate_misses,
    Decode(gets,0,0,misses/gets*100) ratio1,
    Decode(immediate_gets+immediate_misses,0,0,
    immediate_misses/(immediate_gets+immediate_misses)*100) ratio2
    FROM v$latch WHERE name IN ('redo allocation', 'redo copy');

    11. 监控内存和硬盘的排序比率,最好使它小于 .10,增加 sort_area_size SELECT name, value FROM v$sysstat WHERE name IN ('sorts (memory)', 'sorts (disk)');
    12. 监控当前数据库谁在运行什么SQL语句
    SELECT osuser, username, sql_text from v$session a, v$sqltext b
    where a.sql_address =b.address order by address, piece;

    13. 监控字典缓冲区 SELECT (SUM(PINS - RELOADS)) / SUM(PINS) "LIB CACHE" FROM V$LIBRARYCACHE;
    SELECT (SUM(GETS - GETMISSES - USAGE - FIXED)) / SUM(GETS) "ROW CACHE" FROM V$ROWCACHE;
    SELECT SUM(PINS) "EXECUTIONS", SUM(RELOADS) "CACHE MISSES WHILE EXECUTING" FROM V$LIBRARYCACHE; 后者除以前者,此比率小于1%,接近0%为好。 SELECT SUM(GETS) "DICTIONARY GETS",SUM(GETMISSES) "DICTIONARY CACHE GET MISSES"
    FROM V$ROWCACHE

    14. 找Oracle字符集 select * from sys.props$ where name='NLS_CHARACTERSET';

    15. 监控 MTS select busy/(busy+idle) "shared servers busy" from v$dispatcher; 此值大于0.5时,参数需加大 select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher';
    select count(*) from v$dispatcher;
    select servers_highwater from v$mts; servers_highwater接近mts_max_servers时,参数需加大

    16. 碎片程度 select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name
    having count(tablespace_name)>10; alter tablespace name coalesce;
    alter table name deallocate unused; create or replace view ts_blocks_v as
    select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space
    union all
    select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents; select * from ts_blocks_v; select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space
    group by tablespace_name; 查看碎片程度高的表 SELECT segment_name table_name , COUNT(*) extents
    FROM dba_segments WHERE owner NOT IN ('SYS', 'SYSTEM') GROUP BY segment_name
    HAVING COUNT(*) = (SELECT MAX( COUNT(*) ) FROM dba_segments GROUP BY segment_name);

    17. 表、索引的存储情况检查 select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
    tablespace_name='&tablespace_name' and segment_type='TABLE' group by tablespace_name,segment_name; select segment_name,count(*) from dba_extents where segment_type='INDEX' and wner='&owner'
    group by segment_name;

    18、找使用CPU多的用户session 12是cpu used by this session select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value
    from v$session a,v$process b,v$sesstat c
    where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc;

    20.监控log_buffer的使用情况:(值最好小于1%,否则增加log_buffer 的大小)
    select rbar.name,rbar.value,re.name,re.value,(rbar.value*100)/re.value'%' "radio"
    from v$sysstat rbar,v$sysstat re
    where rbar.name='redo buffer allocation retries'
    and re.name='redo entries';

    19、查看运行过的SQL语句:
    SELECT SQL_TEXT
    FROM V$SQL

    资料引用:http://www.knowsky.com/385533.html

  • TD使用遇到的问题以及解决的方法

    2011-04-19 13:37:22

    个人总结TD使用遇到的问题以及解决的方法

    问题一:
       安装过程中,提示用户名密码错误,无法进行下一步的安装,原因数据执行保护DEP不允许该程序执行。解决方法:右击“我的电脑”选择“属性”高级-》性能【设置】数据执行保护,选择选项:为除下列选定程序之外的所有程序和服务启动DEP(U),点击【添加】按钮,找到TD安装程序中的bin目录下/或者是C:\Program Files\Common Files\Mercury Interactiver 的checku.exe,添加上即可。


    2.Checker时,显示    SendAllQualified Service 服务失败, cannot get properties -service does not exitst

    到网上查看解决办法,以下解决办法是不正确的:
    解决方案,在运行\打开 框内输入:

    1、 直接运行C:\Program Files\Common Files\Mercury Interactive\TDAPIServer\SendAllQualifiedApp.exe

    2、 运行“sc.exe create SendAllQualifiedApp binpath= "C:\Program Files\Common Files\Mercury Interactive\TDAPIServer\SendAllQualifiedApp.exe" type= own start= auto displayname= "SendAllQualifiedApp"”这个命令创建“SendAllQualifiedApp”服务,然后在控制面板-管理工具-服务里面查找到“SendAllQualifiedApp”服务启动,你会发现启动不了。(要删除此无效服务的方法是在CMD里运行“sc delete SendAllQualifiedApp”)

    如下才是解决的正确方法:

    1、  打开cmd命令窗口;

    2、  转到C:\Program Files\Common Files\Mercury Interactive\TDAPIServer\路径,运行“SendAllQualifiedApp.exe  /install” ,在到控制面板-管理工具-服务里面查找服务启动。test director checker ,重新检测,SendAllQualified 变为绿色,恢复正常。

    4,TD在使用时出现The RPC server is unavailable
      详细介绍如下:
      1). RPC服务未启动。解决:控制面板-管理工具-服务-“Remote Procedure Call(RPC)”,启动一下(自动),服务状态“启动”;
    2).服务器端IIS没装。解决:安装IIS。以2000系统为例,控制面板-添加删除程序-添加删除windows组件-“Internet 信息服务(IIS)”打一下勾,下一步……

    1.TD 检查,OTApool sevice 失败
    可以使用sc命令修复
    sc.exe create OtaPool binpath= "C:\Program Files\Common Files\Mercury Interactive\TDAPIServer\OTAPool.exe" type= own start= auto displayname= "OtaPool"


    2.TD数据库的默认密码为 :tdtdtd
    C:\Program Files\Common Files\Mercury Interactive\DomsInfo下。这个目录包含了Doms.mdb文件(用户信息和工程列表)、connection strings(连接字符串)、parameters(参数)、global style. sheets(全局风格表)、the database template(Empty_DB.mdb)(一些临时数据)

    3.修改TD超级管理员的密码

    C:\Program Files\Common Files\Mercury Interactive
    打开Doms.mdb,密码为tdtdtd,进入admin表,将ADMIN_PWD的值改成空,或者改成455575(密文),明文对应为123456,重启TD服务器
    打开TD登录,其管理员的密码可以是空或者123456

    3.修改TD每个项目管理员(admin)的密码

    打开TD_DIR\项目\TestDir.mdb中的users表将admin的US_PASSWORD清空,则密码为空。

    4.普通项目用户,登陆site administrator,在user tab重置该用户密码。


    5.当TD登录时候出现 网络错误或磁盘错误,请检查server服务是不是异常停止了,这是犹豫系统的漏洞造成的,请用360扫描漏洞之后升级系统即可

    注意:

    如果安装IIS时出现“将加密数据写入Web服务器配置数据库时出错” 的提示:

     IIS安装报错

    报错的可能是:
    0x8009000f=对象已经存在;
    0x80070006=句柄无效;
    IIS Admin Service 服务无法启动;
    World Wide Web Publishing Service 服务无法启动 ……
     
    出现这种问题,可以选“不加密写入”和“全部不加密写入”,但若在完成安装后对数据的安全有影响,并且这样的方式写入可能还是会出现一些其它的问题,如IIS的相关服务不能启动如是而已。
     
    解决这样问题的方法是:删除C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\Machine Keys 下的所有文件,然后点击“重试”,若在使用“不加密写入”或“全部不加密写入”后IIS有相关服务出现问题。那么就需要重新安装IIS,若上安装过程出现问题只需按照上边的操作,删除对应文件夹的所有文件即可。

    该方法确实有效 !

    DEFECT
    BG_ACTUAL_FIX_TIME 缺陷修复的实际时间
    BG_RESPONSIBLE  被分配给
    BG_CLOSING_VERSION 已关闭缺陷的版本
    BG_CLOSING_DATE  关闭日期
    BG_BUG_ID  缺陷ID
    BG_DESCRIPTION  描述
    BG_DETECTED_BY  发现者
    BG_EDTECTION_VERSION 版本
    BG_DETECTION_DATA 发现日期
    BG_ESTIMATED_FIX_TIME 估计修复的时间
    BG_VTS   修改时间
    BG_PLANNED_CLOSING_VER 计划关闭的版本
    BG_PRIORITY  缺陷优先级
    BG_PROJECT  项目
    BG_DEV_COMMENTS  研发注释
    BG_REPRODUCIBLE  能否重现
    BG_SEVERITY  严重级别
    BG_STATUS  缺陷状态
    BG_SUMMARY  概要


    TEST
    TS_CREATION_DATE 建立日期
    TS_DESCRIPTION  描述
    TS_RESPONSIBLE  设计者
    TS_ESTIMATE_DEVTIME 估计设计和生成测试的时间
    TS_EXEC_STATUS  执行状态
    TS_VTS   修改时间
    TS_PATH   路径
    TS_STATUS  状态
    TS_STEPS  步骤
    TS_TEMPLATE  模板
    TS_NAME   测试名称
    TS_TYPE   类型


    TEST STEP
    ST_ACTUAL  实际结果
    ST_DESCRIPTION  描述
    ST_EXECUTION_DATE 执行日期
    ST_EXECUTION_TIME 执行时间
    ST_EXPECTED  预期结果
    ST_TEST_ID  测试资料
    ST_STATUS  状态
    ST_STEP_NAME  步骤名称


    RUN
    RN_DURATION  持续时间
    RN_EXECUTION_DATE 执行日期
    RN_EXECUTION_TIME 执行时间
    RN_HOST   主机名
    RN_OS_NAME  操作系统
    RN_os_BUTLD  操作系统生成的编号
    RN_OS_SP  操作系统的服务软件包
    RN_RUN_NAME  运行名称
    RN_STATUS  状态
    RN_TEST_VERSION  测试的版本
    RN_TESTER_NAME  测试员


    REQUIREMENT
    RQ_REQ_AUTHOR  作者
    RQ_REQ_STATUS  覆盖状态
    RQ_REQ_DATE  建立日期
    RQ_REQ_TIME  建立时间
    RQ_REQ_COMMENT  描述
    RQ_VTS   修改时间
    RQ_REQ_NAME  需求名称
    RQ_REQ_PRIORITY  优先级
    RQ_REQ_PRODUCT  产品
    RQ_REQ_ID  需求ID
    RQ_REQ_REVIEWED  被检查
    RQ_REQ_TYPE  类型


    TEST IN TESTSET
    TC_EXEC_DATE  执行日期
    TC_VTS   修改时间
    TC_PLAN_SCHEDULING_DATE 计划执行日期
    TC_PLAN_SCHEDULING_TIME 计划执行时间
    TC_HOST_NAME  计划执行主机名
    TC_TESTER_NAME  测试负责人
    TC_STATUS  状态
    TC_TEST_VERSION  测试版本
    TC_ACTUAL_TESTER 测试员
    TC_EXEC_TIME  执行时间


    TESTSET
    CY_CLOSE_DATE  关闭日期
    CY_COMMENT  描述
    CY_VTS   修改时间
    CY_OPEN_DATE  打开日期
    CY_STATUS  状态
    CY_CYCLE  测试集

  • Failed to transmit data to network:[10054]connection reset by peer

    2010-01-06 10:02:13

    在controller运行时,output日志中会报错误:Failed to transmit data to network:[10054]connection
    原因与我安装的卡巴斯基杀毒软件的设置有关:
    添加如下设置:设置--->保护--〉信任区域--〉信任程序中添加mmdrv.exe,lr_bridge.exe.
    在排除码中,添加LRLauncherApp.exe,vugen.exe
Open Toolbar