<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=118 </link><title>基于μClinux操作系统下Boa的CGI技术实现</title><author>julia</author><pubDate>2009-11-28 12:14:48</pubDate><description><![CDATA[<strong>引 言</strong>
<p sizset="0" sizcache="3">　　随着企业安全意识的增强以及现代化管理水平的提高，对设备的远程监控在工业控制系统中得到了越来越广泛的应用。近年来，Web技术广泛普及，把Web技术应用在这种监控系统中，可以让操作者通过浏览器维护和管理监测点，查看监测数据。同时，监测中心的服务程序也可以很方便地通过Web把监测数据取回来，进行进一步的处理，十分方便。</p>
<p jquery1259381611644="36">　　&mu;Clinux是应用于微控制领域的一种<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="35"><font color="#0033cc">嵌入式</font></a>Linux操作系统，它源码开放，移植性好，支持多种硬件平台和几乎所有常见网络通信协议，支持文件系统丰富，是一个功能完整的<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="37"><font color="#0033cc">嵌入式</font></a>操作系统。并且有大量优秀的开放源代码的应用软件和开发工具可用，因此，采用&mu;Clinux作为操作平台，使用Web技术进行远程在线监测系统的开发。</p>
<p jquery1259381611644="40">　　<strong jquery1259381611644="39">1 <a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="38"><font color="#0033cc">嵌入式</font></a>Web服务器</strong></p>
<p jquery1259381611644="42">　　为了能够通过Web来维护和管理远程在线监控系统，必须选择一个恰当的Web服务器，不但要求所选择的Web服务器支持动态Web技术，也要求它能够在<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="41"><font color="#0033cc">嵌入式</font></a>系统中稳定地工作。</p>
<p>　　<strong>1．1 Web服务器原理和功能</strong></p>
<p jquery1259381611644="44">　　<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="43"><font color="#0033cc">嵌入式</font></a>Web服务器以TCP／IP协议栈为基础构建，需要实现HTTP，TCP和UDP等协议。任何一个客户机，都可以通过HTTP协议与<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="45"><font color="#0033cc">嵌入式</font></a>Web Server建立连接。<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="46"><font color="#0033cc">嵌入式</font></a>Web服务器在Web浏览器和设备之间提供了统一的GUI接口，使得客户端可以像在本地一样透明地监控管理设备状况。</p>
<p jquery1259381611644="48">　　<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="47"><font color="#0033cc">嵌入式</font></a>Web服务器的主要功能有：响应多个客户的实时HTTP请求，并为每个客户建立连接，这是<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="49"><font color="#0033cc">嵌入式</font></a>Web服务器的首要功能；对设备的实时监控管理，参数的在线查看与配置等；对设备访问的安全控制机制，包括SSL、用户口令等；实现设备的故障智能报警。</p>
<p>　　<strong>1．2 Boa的特点</strong></p>
<p jquery1259381611644="51">　　在&mu;Clinux中常用的Web服务器有：Boa，thttpd，httpd，其中httpd只支持静态页面，显然不适合高级应用，thttpd和Boa所提供的功能基本一样，但是thttpd在运行过程中所需要的资源要远大于Boa，因此使用Boa作为该<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="50"><font color="#0033cc">嵌入式</font></a>系统的Web服务器。系统的软件开发模型选用B／S模型。</p>
<p jquery1259381611644="53">　　Boa是一个高性能的单任务型Web服务器，可以运行在几乎所有的类Unix的平台上，Boa支持认证，支持CGI，功能比较全，占用资源也少，非常适合于用在资源有限的<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="52"><font color="#0033cc">嵌入式</font></a>系统中，目前Boa已经以源码的形式包含在&mu;Clinux的发行包中。</p>
<p>　　<strong>2 Boa源码分析</strong></p>
<p>　　在此通过以下对Boa的源代码进行简单的分析，来提出解决避免恶意攻击的安全解决方案。</p>
<p>　　<strong>2．1 Boa工作流程</strong></p>
<p>　　图1是Boa工作流程图。Boa从新到达的套接字获得HTTP请求(由一个request结构来存储)，并将其保存在队列当中。首先，get_request()将从套接字获得的数据全部保存在request&rarr;header_line中，然后调用process_request()来处理在队列中的每一个请求。根据request结构中status所表示的不同状态，将进行不同的处理。如果这个请求符合HTTP协议，则会调用process_option_Iine()将一些头部信息填写到request结构中完成这些环境变量的设置，随后process_header_end()会对用户进行验证。如果验证通过则判断request结构中的is_cgi，非0则是CGI程序，调用init_cgi()函数进行处理，为0则是静态页面，调用init_get()函数进行处理。</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="Boa工作流程图" src="/uploadfile/qrs/uploadfile/200911/20091116020916110.jpg" width="440" height="431" /></p>
<p>　　<strong>2．2 init_get函数工作流程</strong></p>
<p>　　图2为处理静态页面请求的init_get()函数的基本工作流程。图2中process_get()函数完成的功能为将request结构中的data_men字符串返回套接字并在用户浏览器上显示相应的内容。</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="处理静态页面请求的init" src="/uploadfile/qrs/uploadfile/200911/20091116020917126.jpg" width="448" height="271" /></p>
<p>　　<strong>2．3 init_cgi函数工作流程</strong></p>
<p>　　对CGI程序的处理函数init_cgi()首先调用一系列函数完成对CGI环境变量的设置，create_common_env()，complete_env()完成了大多数CGI环境变量的注册工作。采用PIPE(管道)方式，就是将CGI程序的输出重定向到管道，然后Boa从管道读取并转发给客户端浏览器。整个流程结束后，返回到主函数的无限循环中等待处理下一个套接字连接的到达。init_cgi()具体工作流程如图3所示。</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="init" src="/uploadfile/qrs/uploadfile/200911/20091116020917170.jpg" width="448" height="561" /></p>
<p>　　管道读取函数read_from_pipe()完成的主要功能是从套接字req&rarr;data_fd读取数据到req&rarr;header_end中，并进行处理；然后修改req&rarr;status＝PIPE_WRITE来调用write_from_pipe()将req&rarr;header_line的内容返回套接字fd，并在用户浏览器上显示相应的内容。</p>
<p>　　<strong>3 Boa源码改进</strong></p>
<p>　　经过上述对Boa源码的分析可以看出，Boa服务器将根据浏览器地址栏中输入的文件路径调用相应的CGI程序或静态页面显示在浏览器中。这种方式使入侵者很容易找到源文件，隐蔽性和安全性极差。这里在对Boa源码进行修改后，在浏览器中输入对该系统指定的静态网页类型的请求后，Boa服务器会自动进行文件路径重定向，调用相应的CGI程序进行处理，而用户不会察觉到这一变化。从而使用户无法得知源文件的路径，增加了程序的隐蔽性和安全性。</p>
<p>&nbsp;</p>
<p>　　在源代码判断是否CGI程序之前添加判断：如果文件路径(req&rarr;pathname)的后缀代表本系统指定的静态页面，则将其修改为实际CGI程序所在路径，并更改is_cgi变量为&ldquo;CGI&rdquo;。经过这样修改后，程序会调用CGI程序的处理函数init_cgi()，使原本的静态请求变成动态的CGI请求。修改后的Boa流程如图4所示(虚线为添加部分)。</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="修改后的Boa流程" src="/uploadfile/qrs/uploadfile/200911/20091116020918349.jpg" width="419" height="248" /></p>
<p>　　<strong>4 CGI程序设计技术</strong></p>
<p><strong>　　4．1 CGI简介</strong></p>
<p>　　到目前为止，实现动态Web页面有4种技术可供选择：CGI，ASP，PHP和JSP。因为目前&mu;Clinux还不支持ASP，PHP等动态Web页面技术，因此在该实现中选择了CGI。</p>
<p>　　CGI规定Web服务器调用其他可执行程序的接口协议标准，提供Web服务器一个执行外部程序的通道。这种服务端技术使得浏览器和服务器之间具有交互性。CGI程序属于一个外部程序，需要编译成可执行文件，以便在服务端运行。Web服务器通过调用CGI程序实现与Web浏览器的交互，也就是CGI程序接收Web浏览器发送给Web服务器的信息，进行处理，将响应结果再回送给Web服务器及Web浏览器。</p>
<p>　　<strong>4．2 CGI程序工作原理</strong></p>
<p>　　CGI工作原理如下：客户端的用户通过浏览器完成一定输入工作后，向服务器发出。HTTP请求(称为CGI请求)，服务器守护进程，接收到该请求后，就创建一个子进程(称为CGI进程)。该CGI子进程将CGI请求的有关数据设置成环境变量，在CGI程序与服务器间建立两台数据通道，然后启动URL指定的CGI程序。子进程通过标准输出流将处理结果传递给服务器守护进程，守护进程再将处理结果作为应答消息回送到客户端。一个CGI程序的任务分为输入任务和输出任务。输入任务根据请求方法的不同，从环境变量QUE-RY_STRING或标准输入中读取用户输入数据。输出任务生成HTTP响应头标内容，如消息正文的数据类型和数据长度等；生成HTTP响应消息正文内容，如动态生成的HTML文件内容。</p>
<p>　　<strong>4．3 CGI程序改进方法</strong></p>
<p>　　传统的CGI程序编写方法简单地用printf()函数来产生HTML源代码。在输出的字符串中如果有双引号，在其前面必须有一个后斜字符，这是因为整个HTML代码串已经在双引号内，所以HTML代码串中的双引号符必须用一个后斜字符来转义。这样的CGI程序代码冗长，不利于阅读，且容易出错。这里所采用的方法是预先将需要显示的网页保存成文件，采用仿&ldquo;ASP&rdquo;的技术，将需要动态显示的内容写入符号&ldquo;|％&rdquo;与&ldquo;|&rdquo;之间。并设计配置文件，指定替换内容。CGI程序逐行读取源文件，将符号&ldquo;|%&rdquo;与&ldquo;|&rdquo;之间的内容替换成配置文件指定的内容。</p>
<p>　　HTML源文件的格式设计如下：</p>
<p>　　单选按钮：</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="程序" src="/uploadfile/qrs/uploadfile/200911/20091116020918557.jpg" width="420" height="112" /></p>
<p>　　CGI程序找出&ldquo;|％&rdquo;与&ldquo;|&rdquo;之间的关键字key，如果key中不包含&ldquo;@&rdquo;则直接替换与之对应的值；如果包含&ldquo;@&rdquo;，将关键字分为三部分：replacestr=checked，key=system_mode，keyvalue=route。寻找数据结构中与key相等的name[i]，将对应的value[i]与keyval-ue比较，如果相等则替换为type的值。具体流程如图5所示。</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="具体流程" src="/uploadfile/qrs/uploadfile/200911/20091116020919276.jpg" width="405" height="296" /></p>
<p>　　当在任意用户端浏览器中输入目标板的IP地址及对应的文件名后，就会显示如图6所示界面。其中在地址栏中输入的路径已经按照本文之前的方法被Boa服务器修改，实际路径为：http：／／192．168．0．1／cgi-bin／qs2．cgi。因此用户无法找到源文件，减小了被恶意用户攻击的可能性。图5中选中单选框和添加文本框内容这些操作都是经过CGI程序替换显示的配置文件中的内容。修改这些内容后点击下一步程序会自动保存到配置文件中，下一次再进入页面后就会显示上一次保存的结果。</p>
<p align="center"><img style="letter-spacing: normal" border="0" hspace="0" alt="演示程序页面" src="/uploadfile/qrs/uploadfile/200911/20091116020919962.jpg" width="377" height="263" /></p>
<p>　　<strong>5 结 语</strong></p>
<p jquery1259381611644="55">　　这里通过对Boa源代码的分析，提供了较为完善的文件隐藏机制，该研究为Web服务器在<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="54"><font color="#0033cc">嵌入式</font></a>设备远程监控应用中提出了一个更为安全的解决方案。此外，通过对传统的CGI程序设计方法进行改进，可显著减少CGI程序代码量，使其便于修改升级。这种方法完全可以应用在其他<a class="jt" href="http://www.eeworld.com.cn" rel="http://www.eeworld.com.cn/my/keyad/ad_content_01.html" target="_blank" jquery1259381611644="56"><font color="#0033cc">嵌入式</font></a>系统中，因此具有广泛的应用意义。系统也有一些尚需改进的地方，如：文件路径隐藏方式有些简单；CGI程序配置文件没有进行加密；这些都有待今后进一步研究。</p>]]></description></item></channel></rss>