boa 源码分析(2)--关于Boa和CGI

1.2 Boa 的特色

  在μClinux中经常使用的Web服务器有:Boa,thttpd,httpd,其中httpd只支持静态页面,显然不适合高级应用,thttpd和 Boa所提供的功能基本同样,可是thttpd在运行过程当中所须要的资源要远大于Boa,所以使用Boa做为该嵌入式系统的Web服务器。系统的软件开发模型选用B/S模型。linux

  Boa是一个高性能的单任务型Web服务器,能够运行在几乎全部的类Unix的平台上,Boa支持认证,支持CGI,功能比较全,占用资源也少,很是适合于用在资源有限的嵌入式系统中,目前Boa已经以源码的形式包含在μClinux的发行包中。浏览器

  2 Boa源码分析安全

  在此经过如下对Boa的源代码进行简单的分析,来提出解决避免恶意攻击的安全解决方案。服务器

  2.1 Boa工做流程数据结构

  图1是Boa工做流程图。Boa重新到达的套接字得到HTTP请求(由一个request结构来存储),并将其保存在队列当中。首先,get_request()将从套接字得到的数据所有保存在request→header_line中,而后调用process_request() 来处理在队列中的每个请求。根据request结构中status所表示的不一样状态,将进行不一样的处理。若是这个请求符合HTTP协议,则会调用 process_option_Iine()将一些头部信息填写到request结构中完成这些环境变量的设置,随后 process_header_end()会对用户进行验证。若是验证经过则判断request结构中的is_cgi,非0则是CGI程序,调用 init_cgi()函数进行处理,为0则是静态页面,调用init_get()函数进行处理。函数

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页

  2.2 init_get函数工做流程源码分析

  图2为处理静态页面请求的init_get()函数的基本工做流程。图2中process_get()函数完成的功能为将request结构中的data_men字符串返回套接字并在用户浏览器上显示相应的内容。性能

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页

  2.3 init_cgi函数工做流程spa

  对CGI程序的处理函数init_cgi()首先调用一系列函数完成对CGI环境变量的设置,create_common_env(),complete_env()完成了大多数CGI环境变量的注册工做。采用PIPE(管道)方式,就是将 CGI程序的输出重定向到管道,而后Boa从管道读取并转发给客户端浏览器。整个流程结束后,返回到主函数的无限循环中等待处理下一个套接字链接的到达。 init_cgi()具体工做流程如图3所示。设计

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页

  管道读取函数read_from_pipe()完成的主要功能是从套接字req→data_fd读取数据到req→header_end中,并进行处理;而后修改req→status=PIPE_WRITE来调用write_from_pipe()将req→header_line的内容返回套接字fd,并在用户浏览器上显示相应的内容。

 

3 Boa源码改进

  通过上述对Boa源码的分析能够看出,Boa服务器将根据浏览器地址栏中输入的文件路径调用相应的CGI程序或静态页面显示在浏览器中。这种方式使入侵者很容易找到源文件,隐蔽性和安全性极差。这里在对Boa源码进行修改后,在浏览器中输入对该系统指定的静态网页类型的请求后,Boa服务器会自动进行文件路径重定向,调用相应的CGI程序进行处理,而用户不会察觉到这一变化。从而使用户没法得知源文件的路径,增长了程序的隐蔽性和安全性。

  在源代码判断是否CGI程序以前添加判断:若是文件路径(req→pathname)的后缀表明本系统指定的静态页面,则将其修改成实际CGI程序所在路径,并更改is_cgi变量为“CGI”。通过这样修改后,程序会调用CGI程序的处理函数init_cgi(),使本来的静态请求变成动态的CGI请求。修改后的Boa流程如图4所示(虚线为添加部分)。

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页

  4 CGI程序设计技术

  4.1 CGI简介

  到目前为止,实现动态Web页面有4种技术可供选择:CGI,ASP,PHP和JSP。由于目前μClinux还不支持ASP,PHP等动态Web页面技术,所以在该实现中选择了CGI。

  CGI规定Web服务器调用其余可执行程序的接口协议标准,提供Web服务器一个执行外部程序的通道。这种服务端技术使得浏览器和服务器之间具备交互性。CGI程序属于一个外部程序,须要编译成可执行文件,以便在服务端运行。Web服务器经过调用CGI程序实现与Web浏览器的交互,也就是CGI程序接收Web浏览器发送给Web 服务器的信息,进行处理,将响应结果再回送给Web服务器及Web浏览器。

  4.2 CGI程序工做原理

  CGI工做原理以下:客户端的用户经过浏览器完成必定输入工做后,向服务器发出。HTTP请求(称为CGI请求),服务器守护进程,接收到该请求后,就建立一个子进程(称为CGI进程)。该CGI子进程将CGI请求的有关数据设置成环境变量,在CGI程序与服务器间创建两台数据通道,而后启动URL指定的CGI程序。子进程经过标准输出流将处理结果传递给服务器守护进程,守护进程再将处理结果做为应答消息回送到客户端。一个CGI程序的任务分为输入任务和输出任务。输入任务根据请求方法的不一样,从环境变量QUE-RY_STRING或标准输入中读取用户输入数据。输出任务生成HTTP响应头标内容,如消息正文的数据类型和数据长度等;生成HTTP响应消息正文内容,如动态生成的HTML文件内容。

  4.3 CGI程序改进方法

  传统的CGI程序编写方法简单地用printf()函数来产生HTML源代码。在输出的字符串中若是有双引号,在其前面必须有一个后斜字符,这是由于整个HTML代码串已经在双引号内,因此HTML代码串中的双引号符必须用一个后斜字符来转义。这样的CGI程序代码冗长,不利于阅读,且容易出错。这里所采用的方法是预先将须要显示的网页保存成文件,采用仿“ASP”的技术,将须要动态显示的内容写入符号“|%”与“|”之间。并设计配置文件,指定替换内容。CGI程序逐行读取源文件,将符号“|%”与“|”之间的内容替换成配置文件指定的内容。

  HTML源文件的格式设计以下:

  单选按钮:

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页

  CGI程序找出“|%”与“|”之间的关键字key,若是key中不包含“@”则直接替换与之对应的值;若是包含“@”,将关键字分为三部分:replacestr=checked,key=system_mode,keyvalue=route。寻找数据结构中与key相等的 name[i],将对应的value[i]与keyval-ue比较,若是相等则替换为type的值。具体流程如图5所示。

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页

  当在任意用户端浏览器中输入目标板的IP地址及对应的文件名后,就会显示如图6所示界面。其中在地址栏中输入的路径已经按照本文以前的方法被Boa服务器修改,实际路径为:http://192.168.0.1/cgi-bin/qs2.cgi。所以用户没法找到源文件,减少了被恶意用户攻击的可能性。图5中选中单选框和添加文本框内容这些操做都是通过CGI程序替换显示的配置文件中的内容。修改这些内容后点击下一步程序会自动保存到配置文件中,下一次再进入页面后就会显示上一次保存的结果。

boa 流程分析 - xiaoyao183 - liuyue18301的我的主页