发布新日志

  • 性能测试工程师的面试题(转载)

    2009-01-07 11:10:04

    性能测试工程师的面试题
         1.什么是负载测试?什么是性能测试?
     
          2.性能测试包含了哪些测试(至少举出3种)
     
          3.简述性能测试的步骤
     
          4.简述使用Loadrunner的步骤
     
          5.什么时候可以开始执行性能测试?
     
          6.LoadRunner由哪些部件组成?
     
          7.你使用LoadRunner的哪个部件来录制脚本?
     
          8.LoadRunner的哪个部件可以模拟多用户并发下回放脚本?
     
          9.什么是集合点?设置集合点有什么意义?Loadrunner中设置集合点的函数是哪个?
     
          10.什么是场景?场景的重要性有哪些?如何设置场景?
     
          11.请解释一下如何录制web脚本?
     
          12.为什么要创建参数?如何创建参数?
     
          13.什么是关联?请解释一下自动关联和手动关联的不同。
     
          14.你如何找出哪里需要关联?请给一些你所在项目的实例。
     
          15.你在哪里设置自动关联选项?
     
          16.哪个函数是用来截取虚拟用户脚本中的动态值?(手工管联)
     
          17.你在VUGen中何时选择关闭日志?何时选择标准和扩展日志?
     
          18.你如何调试LoadRunner脚本?
     
          19你在LR中如何编写自定义函数?请给出一些你在以前进行的项目中编写的函数。
     
          20.在运行设置下你能更改那些设置?
     
          21.你在不同的环境下如何设置迭代?
     
          22.你如何在负载测试模式下执行功能测试?
     
          23.什么是逐步递增?你如何来设置?
     
          24.以线程方式运行的虚拟用户有哪些优点?
     
          25.当你需要在出错时停止执行脚本,你怎么做?
     
          26.响应时间和吞吐量之间的关系是什么?
     
          27.说明一下如何在LR中配置系统计数器?
     
          28.你如何识别性能瓶颈?
     
          29.如果web服务器、数据库以及网络都正常,问题会出在哪里?
     
          30.如何发现web服务器的相关问题?
     
          31.如何发现数据库的相关问题?
     
          32.解释所有web录制配置?
     
          33.解释一下覆盖图和关联图的区别?
     
          34.你如何设计负载?标准是什么?
     
          35.Vuser_init中包括什么内容?
     
          36. Vuser_end中包括什么内容?
     
          37.什么是think time?think_time有什么用?
     
          38.标准日志和扩展日志的区别是什么?
     
          39.解释以下函数及他们的不同之处。
     
          40.什么是吞吐量?
     
          41.场景设置有哪几种方法?
  • (转) Linux_Swap持续增长的问题(tcpdump引入,与使用方法)

    2008-12-23 14:15:50

    关于swap持续增长:
    • 怀疑存在内存泄露,对于什么原因引起的泄露,初步怀疑与服务器玩家上下线登录时内存未释放有关。
      • 问题排查的思路:
        • (1)确定标准系统中哪些情况会造成swap的持续增长
        • (2)确定swap的增长与系统其它性能指标的关系,这个使用Excel分析比较麻烦,经常需要动态加载某条曲线,改良中。
        • (3)如何在不修改程序版本的基础上,优化这种现象(Linux系统参数调整)
        • (4)程序的哪一部分可能形成这样的开销情况(大量使用内存进行交互),缩小排查的范围(拟定后期的测试计划)
    • 怀疑和系统的连接数与mysql的连接数有关,一个用户登录到底使用了几个Connections问题(mysql端),连接数不释放也可能造成内存持续增长
    • 可能与外网的内存分配机制,这个方面待确定
    • 可能和外网的CentOS系统ipc参数有关,这个系统参数的配置可以在一定程序上缓解系统的压力,优化内存的使用和分配机制  

    超级详细Tcpdump 的用法:

    第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

    第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

    第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

      除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。

      普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。

    # tcpdump

    tcpdump: listening on fxp0

    11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50

    11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43

                           0000 0000 0080 0000 1007 cf08 0900 0000

                           0e80 0000 902b 4695 0980 8701 0014 0002

                           000f 0000 902b 4695 0008 00

    11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97

                           ffff 0060 0004 ffff ffff ffff ffff ffff

                           0452 ffff ffff 0000 e85b 6d85 4008 0002

                           0640 4d41 5354 4552 5f57 4542 0000 0000

                           0000 00

    使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,

    使用-c参数指定要监听的数据包数量,

    使用-w参数指定将监听到的数据包写入文件中保存

     A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:

    #tcpdump host 210.27.48.1

    B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用 括号时,一定要

    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

    #tcpdump tcp port 23 host 210.27.48.1

    E 对本机的udp 123 端口进行监视 123 为ntp的服务端口

    # tcpdump udp port 123



    F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:

    #tcpdump -i eth0 src host hostname

    G 下面的命令可以监视所有送到主机hostname的数据包:

    #tcpdump -i eth0 dst host hostname

    H  我们还可以监视通过指定网关的数据包:

    #tcpdump -i eth0 gateway Gatewayname

    I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:

    #tcpdump -i eth0 host hostname and port 80

    J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包

    ,使用命令:

    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令

    :(在命令行中适用 括号时,一定要

    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

     #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

     #tcpdump tcp port 23 host 210.27.48.1

    第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型

    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,

    greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o

    r' ,'||';

    第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,

    如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。

    #tcpdump –i eth0 host hostname and dst port 80  目的端口是80

    或者

    #tcpdump –i eth0 host hostname and src port 80  源端口是80  一般是提供http的服务的主机

    如果条件很多的话  要在条件之前加and 或 or 或 not

    #tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80

    如果在ethernet 使用混杂模式 系统的日志将会记录

    May  7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.

    May  7 20:03:46 localhost kernel: device eth0 entered promiscuous mode

    May  7 20:03:57 localhost kernel: device eth0 left promiscuous mode

    tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

    Linux下的网络协议分析工具-tcpdump快速入门手册 

    TCPDUMP简介

    在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。

    用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。

    Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。

    用简单的话来定义tcpdump,就是:dump the traffice on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。

    作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东东之一。

    顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

    普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
    -----------------------
    bash-2.02# tcpdump
    tcpdump: listening on eth0
    11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
    11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
    0000 0000 0080 0000 1007 cf08 0900 0000
    0e80 0000 902b 4695 0980 8701 0014 0002
    000f 0000 902b 4695 0008 00
    11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
    ffff 0060 0004 ffff ffff ffff ffff ffff
    0452 ffff ffff 0000 e85b 6d85 4008 0002
    0640 4d41 5354 4552 5f57 4542 0000 0000
    0000 00
    ^C
    ------------------------

    首先我们注意一下,从上面的输出结果上可以看出来,基本上tcpdump总的的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数

    TcpDump的参数化支持

      tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。

      然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。

      显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。

      并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。

      May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled

      虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。

      从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

    TCP功能

    数据过滤

    不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:

    -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。

    例如:tcpdump -b arp 将只显示网络中的arp即地址转换协议信息。

    -i 选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。例如:

    tcpdump -i eth0 只显示通过eth0接口上的所有报头。

    src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向,src host 192.168.0.1指定源主机IP地址是192.168.0.1,dst net 192.168.0.0/24指定目标是网络192.168.0.0。以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。可能有点复杂,看下面例子就知道了:

    tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24

    过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。

    tcpdump ether src 00:50:04:BA:9B and dst……

    过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。

    Tcpdump src host 192.168.0.1 and dst port not telnet

    过滤源主机192.168.0.1和目的端口不是telnet的报头。

    ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。
    例如:

    tcpdump ip src……

    只过滤数据-链路层上的IP报头。

    tcpdump udp and src host 192.168.0.1

    只过滤源主机192.168.0.1的所有udp报头。

    数据显示/输入输出

    TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:

    -l 可以将数据重定向。

    tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。

    -n 不进行IP地址到主机名的转换。

    如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:eth0 < ntc9.1165> router.domain.net.telnet,使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。

    -nn 不进行端口名称的转换。

    上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。

    -N 不打印出默认的域名。

    还是这条信息-N 后就是:eth0 < ntc9.1165 > router.telnet。

    -O 不进行匹配代码的优化。
    -t 不打印UNIX时间戳,也就是不显示时间。
    -tt 打印原始的、未格式化过的时间。
    -v 详细的输出,也就比普通的多了个TTL和服务类型。

     
    TCPDUMP的安装

     在linux下tcpdump的安装十分简单,一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。
      1. rpm包的形式安装
        #rpm -ivh tcpdump-3_4a5.rpm
      这样tcpdump就顺利地安装到你的linux系统中。怎么样,很简单吧。
      2. 源程序的安装
         #tar xvfz tcpdump-3_4a5.tar.Z
        rpm的包可以使用如下命令安装:
         #rpm -ivh tcpdump-3_4a5.src.rpm
        这样就把tcpdump的源代码解压到/usr/src/redhat/SOURCES目录下.

    第二步 做好编译源程序前的准备活动

    在编译源程序之前,最好已经确定库文件libpcap已经安装完毕,这个库文件是tcpdump软件所需的库文件 。同样,你同时还要有一个标准的c语言编译器。在linux下标准的c 语言编译器一般是gcc。 在tcpdump的源程序目录中。有一个文件是Makefile.in,configure命令就是从Makefile.in文件中自动产生Makefile文件。在Makefile.in文件中,可以根据系统的配置来修改BINDEST 和 MANDEST 这两个宏定义,缺省值是
          BINDEST = @sbindir@
          MANDEST = @mandir@
     
    第一个宏值表明安装tcpdump的二进制文件的路径名,第二个表明tcpdump的man 帮助页的路径名,你可以修改它们来满足系统的需求。

      第三步 编译源程序
     
    使用源程序目录中的configure脚本,它从系统中读出各种所需的属性。并且根据Makefile.in文件自动生成Makefile文件,以便编译使用.make 命令则根据Makefile文件中的规则编译tcpdump的源程序。使用make install命令安装编译好的tcpdump的二进制文件。
     
    总结一下就是:
     
          # tar xvfz tcpdump-3_4a5.tar.Z
          # vi Makefile.in
          # . /configure
          # make
          # make install

    关于tcpdump更详细的信息,请查看Man tcpdump

  • 一个安全测试的checklist(转)

    2008-12-01 10:04:43

    1. 不登录系统,直接输入登录后的页面的url是否可以访问

      2. 不登录系统,直接输入下载文件的url是否可以下载,如输入http://url/download?name=file是否可以下载文件file

      3. 退出登录后按后退按钮能否访问之前的页面

      4. ID/密码验证方式中能否使用简单密码。如密码标准为6位以上,字母和数字混合,不能包含ID,连续的字母或数字不能超过n位

      5. 重要信息(如密码,身份证号码,信用卡号等)在输入或查询时是否用明文显示;在浏览器地址栏里输入命令javascrīpt:alert(doucument.cookie)时是否有重要信息;在html源码中能否看到重要信息

      6. 手动更改URL中的参数值能否访问没有权限访问的页面。如普通用户对应的url中的参数为l=e,高级用户对应的url中的参数为l=s,以普通用户的身份登录系统后将url中的参数e改为s来访问本没有权限访问的页面

      7. url里不可修改的参数是否可以被修改

      8. 上传与服务器端语言(jsp、asp、php)一样扩展名的文件或exe等可执行文件后,确认在服务器端是否可直接运行

      9. 注册用户时是否可以以'--,' or 1=1 --等做为用户名

      10. 传送给服务器的参数(如查询关键字、url中的参数等)中包含特殊字符(','and 1=1 --,' and 1=0 --,'or 1=0 --)时是否可以正常处理

      11. 执行新增操作时,在所有的输入框中输入脚本标签(<scrīpt>alert("")</scrīpt>)后能否保存

      12. 在url中输入下面的地址是否可以下载:http://url/download.jsp?file=C:\windows\system32\drivers\etc\hosts,http://url/download.jsp?file=/etc/passwd

      13. 是否对session的有效期进行处理

      14. 错误信息中是否含有sql语句、sql错误信息以及web服务器的绝对路径等

      15. ID/密码验证方式中,同一个账号在不同的机器上不能同时登录

      16. ID/密码验证方式中,连续数次输入错误密码后该账户是否被锁定

      17. 新增或修改重要信息(密码、身份证号码、信用卡号等)时是否有自动完成功能(在form标签中使用autocomplete=off来关闭自动完成功能

  • 网站安全性测试(转)

    2008-12-01 10:03:48

    一个完整的Web安全体系测试可以从部署与基础结构,输入验证,身份验证,授权,配置管理,敏感数据,会话管理,加密,参数操作,异常管理,审核和日志记录等几个方面入手

      数据加密:某些数据需要进行信息加密和过滤后才能进行数据传输,例如用户信用卡信  息、用户登陆密码信息等。此时需要进行相应的其他操作,如存储到数据库、解密发送要用户电子邮箱或者客户浏览器。目前的加密算法越来越多,越来越复杂,但一般数据加密的过程时可逆的,也就是说能进行加密,同时需要能进行解密!

      登录: 一般的应用站点都会使用登录或者注册后使用的方式,因此,必须对用户名和匹配的密码进行校验,以阻止非法用户登录。在进行登陆测试的时候,需要考虑输入的密码是否对大小写敏感、是否有长度和条件限制,最多可以尝试多少次登录,哪些页面或者文件需要登录后才能访问/下载等。

      超时限制:WEB应用系统需要有是否超时的限制,当用户长时间不作任何操作的时候, 需要重新登录才能使用其功能。

      SSL:越来越多的站点使用SSL安全协议进行传送。SSL是Security Socket Lauer(安全套接字协议层)的缩写,是由Netscape首先发表的网络数据安全传输协议。SSL是利用公开密钥/私有密钥的加密技术。(RSA),在位于HTTP层和TCP层之间,建立用户与服务器之间的加密通信,确保所传递信息的安全性。SSL是工作在公共密钥和私人密钥基础上的,任何用户都可以获得公共密钥来加密数据,但解密数据必须要通过相应的私人密钥。进入一个SSL站点后,可以看到浏览器出现警告信息,然后地址栏的http变成 https,在做SSL测试的时候,需要确认这些特点,以及是否有时间链接限制等一系列相关的安全保护。

      服务器脚本语言:脚本语言是常见的安全隐患。每种语言的细节有所不同。有些   脚本允许访问根目录。其他只允许访问邮件服务器,但是经验丰富的黑客可以将服务器用户名和口令发送给他们自己。找出站点使用了哪些脚本语言,并研究该语言的缺陷。还要需要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。最好的办法是订阅一个讨论站点使用的脚本语言安全性的新闻组。

      注:黑客利用脚本允许访问根目录的这个安全隐患特性攻击网站。这个网站包含了脚本代码(有允许访问根目录的特性)就可能有这个安全隐患。

      日志文件:在服务器上,要验证服务器的日志是否正常工作,例如CPU的占用率是否很高,是否有例外的进程占用,所有的事务处理是否被记录等。

      目录:WEB的目录安全是不容忽视的一个因素。如果WEB程序或WEB服务器的处理不适当,通过简单的URL替换和推测,会将整个WEB目录完全暴露给用户,这样会造成很大的风险和安全性隐患。我们可以使用一定的解决方式,如在每个目录访问时有index.htm,或者严格设定WEB服务器的目录访问权限,将这种隐患降低到最小程度。

  • ASP.NET中如何防范SQL注入式攻击(转贴)

    2008-12-01 10:02:37

    一、什么是SQL注入式攻击?

    所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如:

    ⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。

    ⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子:站长资讯网:http://www.net118.com

    System.Text.StringBuilder query = new System.Text.StringBuilder(
    )`'E$j0x!K$p-f'Z7pb0N230007
    m+apbo e230007"SELECT * from Users WHERE login = '")51Testing软件测试网T'Rs.{-H,QX)M
    51Testing软件测试网*nN:j6D^Xz [
    .Append(txtLogin.Text).Append("' AND password='")51Testing软件测试网LuE!l9{b/|+UI-X
    51Testing软件测试网!f'Our5cH+`0Q)I!v
    .Append(txtPassword.Text).Append("'");

    ⑶ 攻击者在用户名字和密码输入框中输入"'或'1'='1"之类的内容。

    ⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。

    ⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。

    ⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。

    如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。

    系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。

    二、如何防范?

    好在要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。

    ⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:

    第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。

    第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。

    第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。

    ⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。

    ⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。

    ⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。

    在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。

    ⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。

    ⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理

数据统计

  • 访问量: 2731
  • 日志数: 5
  • 建立时间: 2008-12-01
  • 更新时间: 2009-01-07

RSS订阅

Open Toolbar