?

網絡應用程序的安全研究與開發

2022-10-13 13:22劉文杰
網絡安全技術與應用 2022年8期
關鍵詞:服務器端序列化接收器

◆劉文杰

(榮成市教育教學研究中心 山東 264300)

在企業級局域網的應用場景中,經常需要開發CS架構的程序,這類程序的穩定性和安全性都是非常重要,服務器端的程序如果穩定性不強則容易崩潰,安全性不好則容易受到攻擊。網絡通信部分涉及的知識點多,開發難度高,并且需要進行長期的測試,普通的開發者很難獨立開發,我們對一款國外的名稱為Networkcomms開源的通信框架進行了深入的研究,這個通信框架面向微軟.net平臺,以開源形式基于Apache License v2協議發布,我們使用這個通信框架開發了多款產品,經過實踐驗證,這個通信框架性能突出,穩定性好,安全性高,值得深入研究。

1 CS架構程序的結構

CS架構的程序,分為客戶端與服務器端,服務器端我們一般以Windows服務的形式部署在服務器上,客戶端可以通過TCP協議與服務器端進行連接,程序的架構如圖1。

圖1 程序架構

2 數據的傳輸

客戶端與服務器端之間的數據需要進行傳輸,數據的傳輸必須穩定高效,通過Networkcomms框架可以輕松的做到這一點,下面我們對框架的數據傳輸部分進行介紹。

2.1 數據的格式

數據通過TCP協議傳輸時,是以二進制的形式在網絡上傳輸,我們在發送數據之前,需要按照一定的格式對數據進行封裝,接收的一方收到數據后,按照預設的格式對數據進行解析。在Networkcomms通信框架中,數據包(Packet)的格式如下:

PacketHeader是數據包頭,PacketData是數據包體,序列化之后的PacketHeader中的第一個字節,存放PacketHeader的數據長度,PacketHeader中的 TotalPayloadSize屬性存放數據包體的數據長度,接收端的程序收到數據包(packet)后,首先根據第一個字節解析出PacketHeader的數據長度,根據數據長度接收數據,進而解析出PacketHeader,并根據PacketHeader中數據包體的數據長度接收數據,解析數據包體。

在.Networkcomms中,數據包頭和數據包體的序列化方案有所不同,數據包頭使用.net框架自帶的BitConverter類對消息頭進行序列化,沒有使用第三方的序列化組件,數據包頭通常不進行壓縮,使用Networkcomms框架進行通信時,數據包包頭常見的是40字節,所以一般沒有對數據包頭進行壓縮的必要,如果壓縮很小的數據反而會使數據變大,所以我們一般不壓縮數據包包頭。

數據包體支持多種序列化的方式,NetworkComms框架內置的序列化器有基于josn的JSONSerializer序列化器,基于谷歌序列化方案protobuf實現的ProtobufSerializer序列化器,也可以使用基于微軟BinaryFormatter實現的二進制序列化器,通常我們使用最多的是ProtobufSerializer序列化器,也是Networkcomms推薦我們使用的序列化器。

圖2 數據序列化器結構

我們在使用時可以非常方便的指定和切換序列化器,使用networkComms通信框架,在數據傳遞之前需要指定序列化器,我們可以進行統一的配置,不需要每次通信時都進行指定,指定默認序列化器的方式如下:

上面的代碼中SendReceiveOptions是數據傳輸時存放相關收發數據參數的類,序列化器是參數中的一種,指定了網絡通信時使用ProtobufSerializer作為序列化器。我們在編寫程序時,服務器端與客戶端的序列化器需要一致,否則不能正常的通信。

2.3 數據處理器

Networkcomms框架支持對數據進行壓縮或者加密處理,這個主要依托數據處理器進行,內置的用于數據壓縮的處理器有SharpZipLibCompressor,QuickLZCompressor,用于數據填充的處理器有DataPadder,DataPadder處理器支持填充隨機數據,數據填充的目的是增加數據被截取后破譯的難度。所有的數據處理器都繼承自DataProcessor類。用戶也可以根據需要實現自定義的數據處理器,自定義的數據處理器也需要繼承自DataProcessor類。

圖3 數據處理器結構

不同于數據的序列化,數據處理器在非必要的情況下,可以不使用。也可以根據需要同時使用多個數據處理器,比如即使用SharpZipLibCompressor數據處理器對數據進行壓縮,也使用DataPadder數據處理器對數據進行填充。啟動數據處理器需要在TCP連接之前進行配置,配置只需要通過簡單的幾行代碼便可完成,如下:

通常在使用處理器時,客戶端與服務器都需要配置相同的數據處理器來對數據進行處理。

2.4 數據流的線程安全

.net框架中用于數據傳輸的stream類并沒有實現線程安全,而線程安全在很多時候是很重要的,能夠確保程序的穩定性。Networkcomms框架對stream類進行了進一步的封裝,創建了ThreadSafeStream類,ThreadSafeStream類繼承自Stream類,擴展了該類的功能,并且解決了多線程訪問時的數據流的安全問題。

2.5 SSL加密連接

在安全性要求較高的場景下,可以啟用SSL加強數據的安全性。SSL也稱為安全套接字協議,能夠提升數據傳輸時的安全性,防止數據在傳輸時被截取。使用SSL傳輸數據,能夠有效維護數據的完整性。Networkcomms框架創建了SSLTools類用于支持SSL。

2.6 對不規則數據啟用拒絕服務攻擊防護

拒絕服務攻擊是一種常見的網絡攻擊方式,攻擊者可以頻繁的與服務器進行連接,消耗服務器的帶寬和算力,對服務器端程序造成較大的影響,嚴重的情況下,可以使服務器無法提供正常的服務。

Networkcomms通信框架內置了應對拒絕服務攻擊的方法,可以有效的應對拒絕服務攻擊。當服務器端程序在監聽端口上接收到的數據無法進行正常的解析時,可以判定為異常數據,通過DOSProtection類進行跟蹤和處理。

當服務器收到異常數據,即收到不能正常解析的不規則的數據后,DOSProtection對相關數據的IP進行記錄,默認如果在指定時間段內收到異常的連接請求超過100個,則對相應的IP地址進行查封。我們可對查封的時間長度進行設置,過了這段時間之后可自動解封。

3 文件的傳輸

使用Networkcomms通信框架,我們可以傳送文件,既可以從客戶端把文件發送到服務器端,也可以從服務器端把文件發送到客戶端。小的文件可以一次性發送,大的文件一般需要分塊發送,每一個文件發送時都會分配一個獨特的文件ID,程序支持同時發送多個文件,客戶端和服務器端都能夠發送和接收文件。

圖4 文件發送接收過程

3.1 文件發送

在文件發送時,首先使用FileIDCreator類為文件分配一個文件ID,這個文件ID是獨一無二的,接收端在接收文件數據時,會把文件ID相同的數據派發給同一個文件接收器,文件接收器對數據進行組裝。根據經驗,文件分塊的大小我們設置為40960字節,大于40960字節的文件,一般需要分塊發送。文件發送部分我們設計了文件發送器和文件發送管理器以及顯示文件傳輸進度的文件傳輸控件。

圖5 文件發送架構

3.1.1 文件發送器

文件發送器主要用于發送文件,發送器根據文件地址在磁盤上找到文件生成FileStream文件流。然后把文件流封裝成支持線程安全的ThreadSafeStream數據流。在文件發送器內對文件進行分塊發送,每一個文件塊都有一個“文件塊順序號”,接收端在組裝文件時需要根據這個順序號按照順序組裝文件。文件發送器在發送文件數據時,同時發送當前文件塊的相關信息,相關信息主要包括文件ID、文件名、流的長度、發送的字節數、文件包的順序號。服務器端收到這些數據后,將根據數據信息組裝文件,顯示接收進度,并把文件保存到相應的目錄中。NetworkComms框架在發送消息時,數據包中帶有消息類型,服務器端將會根據消息類型把消息分給不同的消息處理器進行處理。文件數據的消息類型為PartialFileData,文件信息的數據類型是PartialFileDataInfo。

文件發送器中定義了3個事件,分別是FileTransProgress(文件傳輸進度)、FileTransCompleted(文件傳輸完成)、FileTransDisruptted(文件傳輸中斷)。這3個事件與文件傳輸窗體控件關聯。每收到一個文件塊,都會觸發FileTransProgress事件,然后控件中的文件傳輸過程就會更新。如果文件傳輸完成或者文件傳輸中斷,也會觸發相應的事件,窗體控件中會有彈窗顯示文件傳輸完成或者文件傳輸中斷的信息。

3.1.2 文件發送管理器

每當發送一個新文件時,文件發送管理器都會創建一個文件發送器,其能夠對文件發送器進行管理,文件發送完成后,相應的文件發送器會注銷。文件發送管理器中有一個類型為 Dictionary<string,SendFile>的字典類,當有新文件開始發送時,文件ID作為關鍵詞加入到字典類中。當某文件傳輸完成時,從字典類中刪除該文件ID以及相關信息??梢愿鶕募蘒D在文件發送管理器中找到相應的文件發送器。文件發送器中的3個事件,即FileTransProgress(文件傳輸進度)、FileTransCompleted(文件傳輸完成)、FileTransDisruptted(文件傳輸中斷)也會傳遞給文件發送管理器。

3.2 文件接收

相比于文件發送,文件接收會更加復雜一點,在文件接收端,需要對“PartialFileData”,“PartialFileDataInfo”這兩種類型的消息進行處理,“PartialFileData”對應于文件數據,“PartialFileDataInfo”對應于文件信息。接收端接收文件時需要這2個消息都收齊后才能開始文件的接收。我們知道數據包的傳輸是有先后順序的,接收端有可能先收到“PartialFileData”類型的數據包,也有可能先收到“PartialFileDataInfo”類型的數據包。NetworkComms框架在接收端設計了兩個字典類型的容器用于緩存接收到的數據包。

當先收到文件數據,相應的文件信息還沒有收到時,把文件數據加入到incomingDataCache容器中進行緩存,當先收到文件信息時,把文件信息加入到incomingDataInfoCache容器中進行緩存。加入相應的緩存容器時,都以文件的順序號作為關鍵詞。

如果文件數據和文件信息都已經收到,那么就可以啟動文件接收管理器創建文件接收器開始接收文件。

文件接收與文件發送相對應,所以文件接收的實現與文件發送過程有類似的地方,文件接收部分的架構如圖6。

圖6 文件接收架構

3.2.1 文件接收管理器

文件接收管理器對所有需要接收的文件數據進行管理,為每一個需要接收的文件都創建一個文件接收器,把文件ID相同的文件數據都交給同一個文件處理器進行處理,如果兩個文件數據的文件ID相同,說明這兩個文件數據屬于同一個文件,文件處理器將會根據收到的文件信息類進行組裝即可。

文件接收管理器聲明了4個事件,分別是FileTransProgress(文件傳輸進度)、FileTransCompleted(文件傳輸完成)、FileTransDisruptted(文件傳輸中斷)、FileCancelRecv(主動取消文件傳輸)。文件接收管理器在創建文件接收器時會主動的關聯文件接收器的相關事件。

如果文件接收完成,文件接收管理器會注銷相關的文件接收器,這樣能夠節省資源。

3.2.2 文件接收器

文件接收器負責接收文件,文件接收管理器根據文件ID把屬于同一個文件的數據派發給同一個文件處理器,所以每個文件接收器接收到的數據都屬于同一個文件,文件接收器根據文件信息類進行組裝即可,組裝完成后,當前文件接收器注銷。當有收文端接收到新文件后,文件接收管理器會創建新的文件接收器來接收新的文件。

文件接收器重新組裝好文件之后,把文件保存在服務器上。

分塊接收的代碼如下:

3.3 文件傳輸控件

程序中的文件進行傳輸時,可以實時的顯示文件傳輸進度,用戶可以隨時取消文件的發送,當文件傳輸完成時,彈出一個窗口顯示文件發送完成,如果文件發送中斷,也會彈出窗口顯示,傳輸控件與文件發送器或文件接收器中的事件相關聯,可以實時的顯示出文件傳輸的進度,如果用戶需要取消文件的發送或者接收,可以點擊取消按鈕進行取消。文件傳輸時的效果如圖7。

圖7 文件傳輸效果圖

4 用戶管理

當客戶端與服務器端的TCP連接建立完成之后,客戶端與服務器端就可以開始通信了,客戶端可以發送數據給服務器端,也可以從服務器端獲取數據。在一般的使用場景中,CS架構的程序的第一個窗體通常是用于輸入用戶名和密碼的登錄窗口,把用戶輸入的用戶名和密碼發送給服務器端,服務器端程序連接數據庫,對客戶端發來的用戶名和密碼進行驗證,對不同角色的用戶賦予不同的權限,并返回驗證信息給客戶端。

4.1 令牌認證機制(token)

客戶端發送用戶名和密碼給服務器端,服務器端進行驗證,如果驗證成功返回一個消息給客戶端,客戶端接收服務器返回的驗證消息,如果認證成功,程序跳轉到主窗口,就可以在主窗口中同服務器進行通信了。對于簡單的,對安全性要求不高的程序,這樣是可以的。但存在一個問題,就是程序的客戶端可能被反編譯,攻擊者可以直接修改登錄窗體的代碼,跳過用戶驗證這一步,直接進入到主窗體同服務器進行通信。為了解決這個問題,我們可以使用令牌認證機制。

具體做法是,客戶端發送用戶名和密碼給服務器端,服務器端認證通過后,生成一串字符串作為令牌,并傳遞給客戶端,客戶端以后的每個請求都需要攜帶令牌信息。服務器端接收到消息后,首先解析出數據的類型,如果是請求登錄的消息,則連接數據庫進行認證,其他類型的消息都需要對消息攜帶的令牌消息進行認證,如果缺失令牌,或者令牌認證不通過,服務器端不返回消息給客戶端,或者主動關閉與客戶端的TCP連接。令牌具有時效性,如果客戶端用戶退出登錄,或者客戶端長時間沒有請求消息,令牌都會失效,客戶端再次請求數據時需要重新登錄。

4.2 用戶管理器

CS結構的程序,我們通常在服務器端實現一個用戶管理器,用戶管理器可以對所有在線用戶進行管理。當用戶認證成功后,服務器端把當前用戶加入到在線用戶管理器中。有了用戶管理器的支持,不同的客戶端之間可以進行端到端的聊天,服務器可以轉發用戶上線下線的消息給其他用戶,服務器端可以主動發消息給選定的客戶端,用戶管理器我們用一個字典類實現,代碼如下:

在企業級的場景中,我們經常需要開發cs架構的程序,開發這類程序,NetworkComms是一個成熟的通信框架,值得認真研究。研究這個框架的過程中可以學到很多的知識,特別是網絡通信方面的知識,并對如何應對網絡安全問題有更加深入的認識。

猜你喜歡
服務器端序列化接收器
淺談一種新型的25Hz相敏軌道電路微電子接收器
奇奇小笨探秘海洋世界(六)
基于Qt的安全即時通訊軟件服務器端設計
初中生寫作序列化實踐與思考
基于Qt的網絡聊天軟件服務器端設計
無線充電器
分層次序列化訓練增強考場寫作的增分因素
對“失序”的習作教學之思考和把脈
堅持以讀促寫 注重思維訓練
一種基于Java的IM即時通訊軟件的設計與實現
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合