控制、請(qǐng)求大小限制與異常防護(hù)的 8 個(gè)最佳實(shí)踐)
elli 安全加固清單超時(shí)控制、請(qǐng)求大小限制與異常防護(hù)的 8 個(gè)最佳實(shí)踐【免費(fèi)下載鏈接】elliSimple, robust and performant Erlang web server項(xiàng)目地址: https://gitcode.com/gh_mirrors/ell/elli作為一款以簡(jiǎn)單、健壯、高性能著稱(chēng)的 Erlang web 服務(wù)器elli 憑借極低的內(nèi)存占用和出色的并發(fā)能力成為許多 Erlang 項(xiàng)目搭建 HTTP API 的首選。但任何 Web 服務(wù)器上線前都必須過(guò)安全關(guān)——超時(shí)控制、請(qǐng)求大小限制與異常防護(hù)正是 elli 安全加固的三大核心。本文整理 8 個(gè)經(jīng)過(guò)實(shí)戰(zhàn)驗(yàn)證的最佳實(shí)踐幫你用最小成本把 elli 從能用提升到抗打。先看懂 elli 的內(nèi)置安全防線elli 的防護(hù)機(jī)制并不復(fù)雜幾乎所有關(guān)鍵參數(shù)都在啟動(dòng)時(shí)集中配置。下面是它的默認(rèn)安全配置一覽定義在src/elli.erl的init/1中配置項(xiàng)默認(rèn)值作用request_timeout60000ms等待完整請(qǐng)求行的超時(shí)時(shí)間header_timeout10000ms接收請(qǐng)求頭的超時(shí)時(shí)間body_timeout30000ms接收請(qǐng)求體的超時(shí)時(shí)間max_body_size1024000 字節(jié)約 1MB允許的最大請(qǐng)求體大小accept_timeout10000ms接受新連接的等待超時(shí)min_acceptors20預(yù)啟動(dòng)的 acceptor 進(jìn)程數(shù)最佳實(shí)踐 1用 request_timeout 防止慢速連接拖垮服務(wù) Slowloris 式攻擊的核心就是建立連接后長(zhǎng)時(shí)間不發(fā)送完整請(qǐng)求占住服務(wù)器資源。elli 在src/elli_http.erl的get_request/5中通過(guò)request_timeout控制等待請(qǐng)求行的時(shí)長(zhǎng)超時(shí)后觸發(fā)request_timeout事件并主動(dòng)關(guān)閉 socket。建議生產(chǎn)環(huán)境將request_timeout收緊到 10~15 秒{request_timeout, 15000}最佳實(shí)踐 2分離 header_timeout 與 body_timeout精細(xì)控制各階段超時(shí) ??很多人只配置一個(gè)全局超時(shí)就完事其實(shí) elli 把超時(shí)拆成了多個(gè)維度頭部階段用header_timeout默認(rèn) 10 秒請(qǐng)求體階段用body_timeout默認(rèn) 30 秒。上傳統(tǒng)一慢、頭部應(yīng)快速送達(dá)分開(kāi)配置更科學(xué){header_timeout, 5000}, %% 5 秒收不完頭部直接斷開(kāi) {body_timeout, 60000} %% 大文件上傳給 60 秒超時(shí)發(fā)生時(shí)handle_event/3會(huì)收到client_timeout事件并攜帶receiving_headers或receiving_body上下文方便你定位是哪個(gè)階段出了問(wèn)題見(jiàn)src/elli_example_callback.erl的事件說(shuō)明。最佳實(shí)踐 3用 max_body_size 限制請(qǐng)求大小拒絕超大上傳 這是最容易被忽視的一項(xiàng)。elli 的check_max_size/5src/elli_http.erl會(huì)比對(duì)Content-Length與max_body_size超過(guò)限制但未超過(guò) 2 倍接收完數(shù)據(jù)后返回413 Request Entity Too Large再關(guān)閉連接超過(guò) 2 倍直接關(guān)閉 socket避免浪費(fèi)帶寬讀取惡意大包。同時(shí)會(huì)觸發(fā)bad_request事件參數(shù)為{body_size, ContentLength}。按業(yè)務(wù)場(chǎng)景設(shè)置閾值例如表單接口 1MB、文件接口 10MB{max_body_size, 1024000} %% 1MB最佳實(shí)踐 4善用內(nèi)置的頭部數(shù)量上限防范頭部洪泛 ?elli 在解析請(qǐng)求頭時(shí)內(nèi)置了硬性限制每個(gè)請(qǐng)求最多100 個(gè)頭部src/elli_http.erl的get_headers/6。超限后觸發(fā)bad_request事件參數(shù){too_many_headers, Headers}返回 400 并斷開(kāi)連接。這層防線是寫(xiě)死的無(wú)需配置但你要知道它的存在——不要在業(yè)務(wù)里構(gòu)造超長(zhǎng)頭部列表同時(shí)可以監(jiān)控bad_request事件的頻率來(lái)識(shí)別攻擊。最佳實(shí)踐 5利用異常兜底讓 handler 崩潰也不裸奔 再健壯的代碼也有意外。elli 在execute_callback/1src/elli_http.erl中用 try/catch 包裹了所有用戶(hù)回調(diào)任何throw、error、exit都不會(huì)擊穿服務(wù)器異常類(lèi)型觸發(fā)事件兜底響應(yīng)throwrequest_throw500 Internal Server Errorerrorrequest_error500 Internal Server Errorexitrequest_exit500 Internal Server Error非法返回值invalid_return500 Internal Server Error你只需要在回調(diào)里實(shí)現(xiàn)handle_event/3把request_throw、request_error、request_exit事件接入日志或告警系統(tǒng)就能第一時(shí)間發(fā)現(xiàn)問(wèn)題。最佳實(shí)踐 6在 handle_event 中建立安全監(jiān)控與告警 elli 的事件系統(tǒng)是安全加固的眼睛。elli.hrl中定義了完整的elli_event()類(lèi)型除了上面提到的異常事件還包括request_parse_error請(qǐng)求解析失敗非法報(bào)文request_closed/client_closed連接異常中斷client_timeout/request_timeout超時(shí)事件bad_request超限或畸形請(qǐng)求file_error文件響應(yīng)讀取失敗在src/elli_example_callback.erl中每個(gè)事件都有對(duì)應(yīng)的處理分支注釋。建議把高頻的bad_request、client_timeout與異常事件統(tǒng)一上報(bào)到監(jiān)控系統(tǒng)作為被攻擊的早期信號(hào)。最佳實(shí)踐 7啟用 SSL 與響應(yīng)壓縮雙管齊下 傳輸層安全不可跳過(guò)。elli 通過(guò)ssl配置項(xiàng)啟用 TLS并指定證書(shū)路徑src/elli.erl中讀取keyfile與certfile{ssl, true}, {keyfile, priv/server_key.pem}, {certfile, priv/server_cert.pem}同時(shí)src/elli_middleware_compress.erl提供了壓縮中間件響應(yīng)體超過(guò) 1024 字節(jié)可用compress_byte_size調(diào)整且客戶(hù)端支持時(shí)自動(dòng) gzip/deflate 壓縮。流量變小攻擊面也相應(yīng)縮小。最佳實(shí)踐 8定期壓測(cè)與健康檢查把配置調(diào)出最優(yōu)解 安全配置不是設(shè)了就完。建議用elli_testsrc/elli_test.erl編寫(xiě)回調(diào)單元測(cè)試驗(yàn)證超限請(qǐng)求、畸形請(qǐng)求、異常回調(diào)的響應(yīng)是否符合預(yù)期。上線前再做一輪壓測(cè)確認(rèn)超時(shí)參數(shù)與連接池min_acceptors在真實(shí)流量下不會(huì)誤傷正常用戶(hù)。項(xiàng)目自帶的測(cè)試目錄test/下有elli_http_tests.erl、elli_tests.erl等現(xiàn)成用例可以直接作為安全測(cè)試的起點(diǎn)。小結(jié)elli 的安全加固其實(shí)就三件事卡住時(shí)間各類(lèi) timeout、卡住大小max_body_size 與頭部上限、兜住異常事件系統(tǒng)與 500 兜底。把這 8 個(gè)最佳實(shí)踐落實(shí)到配置與回調(diào)中你的 Erlang web 服務(wù)器就能在保持輕量高性能的同時(shí)穩(wěn)穩(wěn)扛住惡意流量與意外崩潰。別忘了先 clone 項(xiàng)目源碼在src/elli.erl和src/elli_http.erl里逐行讀一遍默認(rèn)邏輯你對(duì)安全邊界的掌控會(huì)完全不同。倉(cāng)庫(kù)地址https://gitcode.com/gh_mirrors/ell/elli【免費(fèi)下載鏈接】elliSimple, robust and performant Erlang web server項(xiàng)目地址: https://gitcode.com/gh_mirrors/ell/elli創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考