#分享 試著做了一個 HTTP Server

國立屏東大學
(好久沒有上 Dcard,才發現 #新手 標籤不見了 QQ) 太久沒有寫程式了,難得遇到連假實在忍不住 XD,所以就試著做了之前一直很想做的 HTTP Server。 ---------- 這個伺服器叫做 Henver HTTP Server,以 Python 編寫而成,用於託管靜態網站,還部分支援簡單的 PHP 網頁。 我研究了好久,實在搞不定 CGI 的部分,而且相關資源也很稀少,所以只好用暴力法破解 XD。當然,這也造成了一些限制,像是 Session 每次都會被重設、無法使用 $_SERVER 等等。原本想說做一個可以 host Wordpress 的 Server 也只好放棄了...(相關程式碼在 ./src/hresponse.py 91 行 [註1],有興趣的大神歡迎指點迷津)。 ---------- 使用方式非常簡單: 1. 由 ./release 資料夾裡面複製出欲使用的版本 2. 把網站檔案放到 ./public 資料夾 3. 使用 python henver.py 命令啟動 server 4. 使用 Ctrl + C 關閉 server 如果要更改伺服器設定只要開啟 ./config/main.ini,然後完成編輯後重啟就可以了。 ---------- Henver 的開發主要著重於安全性,所以相對的 performance 也比較差。安全性的部分有以下功能: 1. URI Length Filter:用戶可以設定最長可接受的 URI 長度,超過此長度的 reqeusts 將會被拋棄。但是當 URI 太過長的時候(比如說超過 131,072 個字元),該連線就會"卡住",但不會影響其他人的連線。 2. Percent-Encoding Filter:這個功能可以 decode 所有包含在 URL 裡的 Precent-Encoding Chars,同時移除所有空白字元。這可以過濾掉很多針對 URL 注入的攻擊(像是目錄遍歷等)。 3. Banned IP Filter:這個功能可以讓用戶手動加入欲封鎖的 IP,而不用依靠第三方軟體(像是 iptables 等),而來自這些 IP 的請求將會被直接丟棄。 4. HTTP Methods Filter:這個功能可以攔截並丟棄所有非法的 HTTP Methods。 5. URL Chars Filter:這個功能可以過濾掉所有包含在 URI 裡的非法字元。預設僅接受 a-z、AZ、0-9,還有一些常用的特殊字元。(例如:如果用戶請求 ind$$ex.php,則伺服器會將它解析成 index.php) 6. 目錄遍歷的 Filter:這個功能會移除所有在 URI 裡的 // 以及 ..。 7. 被動式 DOS/DDOS 防禦(開發中)。 而一些比較基本的功能,像是 error page 的顯示、error log 等等,也都有支援。 ---------- 原本以為伺服器要做的事應該不多,只是回傳頁面之類的,但實際製作之後才發先要做的事可多了 XD。像是伺服器必須依據請求的檔案類型,回傳不同的 headers 以及調整編碼方式、判斷錯誤類型,回傳不同的 HTTP Status Code 等。 Henver 支援一些常見的檔案類型,像是 png, jpeg, gif, svg, mp3, mp4, wav, html, css, js 等等 [註2],可以正常託管 React(這大概可以應付 99% 的靜態網站了)。
megapx
可以正常播放影片:
megapx
---------- 關於資料流的部分: 1. 請求由 client 發出,由 henver.py 進入 2. henvy.py 將請求送到 hrequest,解析 HTTP header 和 URI,並判斷請求檔案類型 3. hrequest 將請求送到 hsecurity,過濾非法請求,並將其重寫。 4. hsecurity 將請求送到 hresponse,根據檔案內容、請求內容等,產出對應的 header 和回應內容,並將其回傳 client。
megapx
---------- 而壓力測試的部分,Henver 大約可以應付每秒 1,000 個請求(畢竟是 Python,所以應該不算太差 XD)(測試方式可以參考 ./penetration test/rps.py [註3])。 ---------- GitHub:
---------- [註1] PHP-CGI 問題:
[註2] 支援的檔案類型(部分):
[註3] 壓力測試:
LikeWow
65
6 comments