《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于μClinux下Boa的CGI技術實現
基于μClinux下Boa的CGI技術實現
摘要: μClinux是應用于微控制領域的一種嵌入式Linux操作系統(tǒng),,它源碼開放,移植性好,支持多種硬件平臺和幾乎所有常見網絡通信協(xié)議,,支持文件系統(tǒng)豐富,是一個功能完整的嵌入式操作系統(tǒng),。并且有大量優(yōu)秀的開放源代碼的應用軟件和開發(fā)工具可用,,因此,采用μClinux作為操作平臺,,使用Web技術進行遠程在線監(jiān)測系統(tǒng)的開發(fā),。
Abstract:
Key words :

  引 言

  隨著企業(yè)安全意識的增強以及現代化管理水平的提高,對設備的遠程監(jiān)控在工業(yè)控制系統(tǒng)中得到了越來越廣泛的應用,。近年來,,Web技術廣泛普及,把Web技術應用在這種監(jiān)控系統(tǒng)中,,可以讓操作者通過瀏覽器維護和管理監(jiān)測點,,查看監(jiān)測數據。同時,,監(jiān)測中心的服務程序也可以很方便地通過Web把監(jiān)測數據取回來,,進行進一步的處理,十分方便,。

  μClinux是應用于微控制領域的一種嵌入式Linux操作系統(tǒng),,它源碼開放,移植性好,,支持多種硬件平臺和幾乎所有常見網絡通信協(xié)議,,支持文件系統(tǒng)豐富,是一個功能完整的嵌入式操作系統(tǒng),。并且有大量優(yōu)秀的開放源代碼的應用軟件和開發(fā)工具可用,,因此,采用μClinux作為操作平臺,,使用Web技術進行遠程在線監(jiān)測系統(tǒng)的開發(fā),。

  1 嵌入式Web服務器

  為了能夠通過Web來維護和管理遠程在線監(jiān)控系統(tǒng),必須選擇一個恰當的Web服務器,,不但要求所選擇的Web服務器支持動態(tài)Web技術,,也要求它能夠在嵌入式系統(tǒng)中穩(wěn)定地工作。

  1.1 Web服務器原理和功能

  嵌入式Web服務器以TCP/IP協(xié)議棧為基礎構建,,需要實現HTTP,,TCP和UDP等協(xié)議。任何一個客戶機,,都可以通過HTTP協(xié)議與嵌入式Web Server建立連接,。嵌入式Web服務器在Web瀏覽器和設備之間提供了統(tǒng)一的GUI接口,使得客戶端可以像在本地一樣透明地監(jiān)控管理設備狀況,。

  嵌入式Web服務器的主要功能有:響應多個客戶的實時HTTP請求,,并為每個客戶建立連接,,這是嵌入式Web服務器的首要功能;對設備的實時監(jiān)控管理,,參數的在線查看與配置等,;對設備訪問的安全控制機制,包括SSL,、用戶口令等,;實現設備的故障智能報警。

  1.2 Boa的特點

  在μClinux中常用的Web服務器有:Boa,,thttpd,,httpd,其中httpd只支持靜態(tài)頁面,,顯然不適合高級應用,,thttpd和Boa所提供的功能基本一樣,但是thttpd在運行過程中所需要的資源要遠大于Boa,,因此使用Boa作為該嵌入式系統(tǒng)的Web服務器,。系統(tǒng)的軟件開發(fā)模型選用B/S模型。

  Boa是一個高性能的單任務型Web服務器,,可以運行在幾乎所有的類Unix的平臺上,,Boa支持認證,支持CGI,,功能比較全,,占用資源也少,非常適合于用在資源有限的嵌入式系統(tǒng)中,,目前Boa已經以源碼的形式包含在μClinux的發(fā)行包中,。

  2 Boa源碼分析

  在此通過以下對Boa的源代碼進行簡單的分析,來提出解決避免惡意攻擊的安全解決方案,。

  2.1 Boa工作流程

  圖1是Boa工作流程圖,。Boa從新到達的套接字獲得HTTP請求(由一個request結構來存儲),并將其保存在隊列當中,。首先,,get_request()將從套接字獲得的數據全部保存在request→header_line中,然后調用process_request()來處理在隊列中的每一個請求,。根據request結構中status所表示的不同狀態(tài),,將進行不同的處理。如果這個請求符合HTTP協(xié)議,,則會調用process_option_Iine()將一些頭部信息填寫到request結構中完成這些環(huán)境變量的設置,,隨后process_header_end()會對用戶進行驗證。如果驗證通過則判斷request結構中的is_cgi,非0則是CGI程序,,調用init_cgi()函數進行處理,,為0則是靜態(tài)頁面,調用init_get()函數進行處理,。

Boa工作流程圖

  2.2 init_get函數工作流程

  圖2為處理靜態(tài)頁面請求的init_get()函數的基本工作流程,。圖2中process_get()函數完成的功能為將request結構中的data_men字符串返回套接字并在用戶瀏覽器上顯示相應的內容。

處理靜態(tài)頁面請求的init

  2.3 init_cgi函數工作流程

  對CGI程序的處理函數init_cgi()首先調用一系列函數完成對CGI環(huán)境變量的設置,,create_common_env(),complete_env()完成了大多數CGI環(huán)境變量的注冊工作,。采用PIPE(管道)方式,,就是將CGI程序的輸出重定向到管道,然后Boa從管道讀取并轉發(fā)給客戶端瀏覽器,。整個流程結束后,,返回到主函數的無限循環(huán)中等待處理下一個套接字連接的到達。init_cgi()具體工作流程如圖3所示,。

init

  管道讀取函數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程序或靜態(tài)頁面顯示在瀏覽器中,。這種方式使入侵者很容易找到源文件,,隱蔽性和安全性極差。這里在對Boa源碼進行修改后,,在瀏覽器中輸入對該系統(tǒng)指定的靜態(tài)網頁類型的請求后,,Boa服務器會自動進行文件路徑重定向,調用相應的CGI程序進行處理,,而用戶不會察覺到這一變化,。從而使用戶無法得知源文件的路徑,增加了程序的隱蔽性和安全性,。

 

  在源代碼判斷是否CGI程序之前添加判斷:如果文件路徑(req→pathname)的后綴代表本系統(tǒng)指定的靜態(tài)頁面,,則將其修改為實際CGI程序所在路徑,并更改is_cgi變量為“CGI”,。經過這樣修改后,,程序會調用CGI程序的處理函數init_cgi(),使原本的靜態(tài)請求變成動態(tài)的CGI請求,。修改后的Boa流程如圖4所示(虛線為添加部分),。

修改后的Boa流程

  4 CGI程序設計技術

  4.1 CGI簡介

  到目前為止,實現動態(tài)Web頁面有4種技術可供選擇:CGI,ASP,,PHP和JSP,。因為目前μClinux還不支持ASP,PHP等動態(tài)Web頁面技術,,因此在該實現中選擇了CGI,。

  CGI規(guī)定Web服務器調用其他可執(zhí)行程序的接口協(xié)議標準,提供Web服務器一個執(zhí)行外部程序的通道,。這種服務端技術使得瀏覽器和服務器之間具有交互性,。CGI程序屬于一個外部程序,需要編譯成可執(zhí)行文件,,以便在服務端運行,。Web服務器通過調用CGI程序實現與Web瀏覽器的交互,也就是CGI程序接收Web瀏覽器發(fā)送給Web服務器的信息,,進行處理,,將響應結果再回送給Web服務器及Web瀏覽器。

  4.2 CGI程序工作原理

  CGI工作原理如下:客戶端的用戶通過瀏覽器完成一定輸入工作后,,向服務器發(fā)出,。HTTP請求(稱為CGI請求),服務器守護進程,,接收到該請求后,,就創(chuàng)建一個子進程(稱為CGI進程)。該CGI子進程將CGI請求的有關數據設置成環(huán)境變量,,在CGI程序與服務器間建立兩臺數據通道,,然后啟動URL指定的CGI程序。子進程通過標準輸出流將處理結果傳遞給服務器守護進程,,守護進程再將處理結果作為應答消息回送到客戶端,。一個CGI程序的任務分為輸入任務和輸出任務。輸入任務根據請求方法的不同,,從環(huán)境變量QUE-RY_STRING或標準輸入中讀取用戶輸入數據,。輸出任務生成HTTP響應頭標內容,如消息正文的數據類型和數據長度等,;生成HTTP響應消息正文內容,,如動態(tài)生成的HTML文件內容。

  4.3 CGI程序改進方法

  傳統(tǒng)的CGI程序編寫方法簡單地用printf()函數來產生HTML源代碼,。在輸出的字符串中如果有雙引號,,在其前面必須有一個后斜字符,這是因為整個HTML代碼串已經在雙引號內,,所以HTML代碼串中的雙引號符必須用一個后斜字符來轉義,。這樣的CGI程序代碼冗長,,不利于閱讀,且容易出錯,。這里所采用的方法是預先將需要顯示的網頁保存成文件,,采用仿“ASP”的技術,將需要動態(tài)顯示的內容寫入符號“|%”與“|”之間,。并設計配置文件,,指定替換內容。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服務器在嵌入式設備遠程監(jiān)控應用中提出了一個更為安全的解決方案,。此外,,通過對傳統(tǒng)的CGI程序設計方法進行改進,可顯著減少CGI程序代碼量,,使其便于修改升級,。這種方法完全可以應用在其他嵌入式系統(tǒng)中,因此具有廣泛的應用意義,。系統(tǒng)也有一些尚需改進的地方,,如:文件路徑隱藏方式有些簡單;CGI程序配置文件沒有進行加密;這些都有待今后進一步研究,。

此內容為AET網站原創(chuàng),,未經授權禁止轉載。