热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

boa流程分析

引言随着企业安全意识的增强以及现代化管理水平的提高,对设备的远程监控在工业控制系统中得到了越来越广泛的应用。近年来,Web技术广泛普及,把

引 言

  随着企业安全意识的增强以及现代化管理水平的提高,对设备的远程监控在工业控制系统中得到了越来越广泛的应用。近年来,Web技术广泛普及,把Web技术应用在这种监控系统中,可以让操作者通过浏览器维护和管理监测点,查看监测数据。同时,监测中心的服务程序也可以很方便地通过Web把监测数据取回来,进行进一步的处理,十分方便。

  μClinux是应用于微控制领域的一种嵌入式Linux操作系统,它源码开放,移植性好,支持多种硬件平台和几乎所有常见网络通信协议,支持文件系统丰富,是一个功能完整的嵌入式操作系统。并且有大量优秀的开放源代码的应用软件和开发工具可用,因此,采用μClinux作为操作平台,使用Web技术进行远程在线监测系统的开发。

  1 嵌入式Web服务器

  为了能够通过Web来维护和管理远程在线监控系统,必须选择一个恰当的Web服务器,不但要求所选择的Web服务器支持动态Web技术,也要求它能够在嵌入式系统中稳定地工作。

  1.1 Web服务器原理和功能

  嵌入式Web服务器以TCP/IP协议栈为基础构建,需要实现HTTP,TCP和UDP等协议。任何一个客户机,都可以通过HTTP协议与嵌入式WebServer建立连接。嵌入式Web服务器在Web浏览器和设备之间提供了统一的GUI接口,使得客户端可以像在本地一样透明地监控管理设备状况。

  嵌入式Web服务器的主要功能有:响应多个客户的实时HTTP请求,并为每个客户建立连接,这是嵌入式Web服务器的首要功能;对设备的实时监控管理,参数的在线查看与配置等;对设备访问的安全控制机制,包括SSL、用户口令等;实现设备的故障智能报警。

  1.2 Boa的特点

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

  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()函数进行处理。

               2.2 init_get函数工作流程

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


             2.3 init_cgi函数工作流程

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

管道读取函数read_from_pipe()完成的主要功能是从套接字req→da

ta_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所示(虚线为添加部分)。

         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源文件的格式设计如下:

  单选按钮:

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

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

           5 结 语

  这里通过对Boa源代码的分析,提供了较为完善的文件隐藏机制,该研究为Web服务器在嵌入式设备远程监控应用中提出了一个更为安全的解决方案。此外,通过对传统的CGI程序设计方法进行改进,可显著减少CGI程序代码量,使其便于修改升级。这种方法完全可以应用在其他嵌入式系统中,因此具有广泛的应用意义。系统也有一些尚需改进的地方,如:文件路径隐藏方式有些简单;CGI程序配置文件没有进行加密;这些都有待今后进一步研究。


原文地址:http://blog.sina.com.cn/s/blog_59a9112f0100rsx1.html



















推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
author-avatar
留恋的花纹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有