尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

elli 安全加固清单:超时控制、请求大小限制与异常防护的 8 个最佳实践

elli 安全加固清单:超时控制、请求大小限制与异常防护的 8 个最佳实践 elli 安全加固清单超时控制、请求大小限制与异常防护的 8 个最佳实践【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/elli作为一款以简单、健壮、高性能著称的 Erlang web 服务器elli 凭借极低的内存占用和出色的并发能力成为许多 Erlang 项目搭建 HTTP API 的首选。但任何 Web 服务器上线前都必须过安全关——超时控制、请求大小限制与异常防护正是 elli 安全加固的三大核心。本文整理 8 个经过实战验证的最佳实践帮你用最小成本把 elli 从能用提升到抗打。先看懂 elli 的内置安全防线elli 的防护机制并不复杂几乎所有关键参数都在启动时集中配置。下面是它的默认安全配置一览定义在src/elli.erl的init/1中配置项默认值作用request_timeout60000ms等待完整请求行的超时时间header_timeout10000ms接收请求头的超时时间body_timeout30000ms接收请求体的超时时间max_body_size1024000 字节约 1MB允许的最大请求体大小accept_timeout10000ms接受新连接的等待超时min_acceptors20预启动的 acceptor 进程数最佳实践 1用 request_timeout 防止慢速连接拖垮服务 Slowloris 式攻击的核心就是建立连接后长时间不发送完整请求占住服务器资源。elli 在src/elli_http.erl的get_request/5中通过request_timeout控制等待请求行的时长超时后触发request_timeout事件并主动关闭 socket。建议生产环境将request_timeout收紧到 10~15 秒{request_timeout, 15000}最佳实践 2分离 header_timeout 与 body_timeout精细控制各阶段超时 ⏱️很多人只配置一个全局超时就完事其实 elli 把超时拆成了多个维度头部阶段用header_timeout默认 10 秒请求体阶段用body_timeout默认 30 秒。上传统一慢、头部应快速送达分开配置更科学{header_timeout, 5000}, %% 5 秒收不完头部直接断开 {body_timeout, 60000} %% 大文件上传给 60 秒超时发生时handle_event/3会收到client_timeout事件并携带receiving_headers或receiving_body上下文方便你定位是哪个阶段出了问题见src/elli_example_callback.erl的事件说明。最佳实践 3用 max_body_size 限制请求大小拒绝超大上传 这是最容易被忽视的一项。elli 的check_max_size/5src/elli_http.erl会比对Content-Length与max_body_size超过限制但未超过 2 倍接收完数据后返回413 Request Entity Too Large再关闭连接超过 2 倍直接关闭 socket避免浪费带宽读取恶意大包。同时会触发bad_request事件参数为{body_size, ContentLength}。按业务场景设置阈值例如表单接口 1MB、文件接口 10MB{max_body_size, 1024000} %% 1MB最佳实践 4善用内置的头部数量上限防范头部洪泛 ️elli 在解析请求头时内置了硬性限制每个请求最多100 个头部src/elli_http.erl的get_headers/6。超限后触发bad_request事件参数{too_many_headers, Headers}返回 400 并断开连接。这层防线是写死的无需配置但你要知道它的存在——不要在业务里构造超长头部列表同时可以监控bad_request事件的频率来识别攻击。最佳实践 5利用异常兜底让 handler 崩溃也不裸奔 再健壮的代码也有意外。elli 在execute_callback/1src/elli_http.erl中用 try/catch 包裹了所有用户回调任何throw、error、exit都不会击穿服务器异常类型触发事件兜底响应throwrequest_throw500 Internal Server Errorerrorrequest_error500 Internal Server Errorexitrequest_exit500 Internal Server Error非法返回值invalid_return500 Internal Server Error你只需要在回调里实现handle_event/3把request_throw、request_error、request_exit事件接入日志或告警系统就能第一时间发现问题。最佳实践 6在 handle_event 中建立安全监控与告警 elli 的事件系统是安全加固的眼睛。elli.hrl中定义了完整的elli_event()类型除了上面提到的异常事件还包括request_parse_error请求解析失败非法报文request_closed/client_closed连接异常中断client_timeout/request_timeout超时事件bad_request超限或畸形请求file_error文件响应读取失败在src/elli_example_callback.erl中每个事件都有对应的处理分支注释。建议把高频的bad_request、client_timeout与异常事件统一上报到监控系统作为被攻击的早期信号。最佳实践 7启用 SSL 与响应压缩双管齐下 传输层安全不可跳过。elli 通过ssl配置项启用 TLS并指定证书路径src/elli.erl中读取keyfile与certfile{ssl, true}, {keyfile, priv/server_key.pem}, {certfile, priv/server_cert.pem}同时src/elli_middleware_compress.erl提供了压缩中间件响应体超过 1024 字节可用compress_byte_size调整且客户端支持时自动 gzip/deflate 压缩。流量变小攻击面也相应缩小。最佳实践 8定期压测与健康检查把配置调出最优解 安全配置不是设了就完。建议用elli_testsrc/elli_test.erl编写回调单元测试验证超限请求、畸形请求、异常回调的响应是否符合预期。上线前再做一轮压测确认超时参数与连接池min_acceptors在真实流量下不会误伤正常用户。项目自带的测试目录test/下有elli_http_tests.erl、elli_tests.erl等现成用例可以直接作为安全测试的起点。小结elli 的安全加固其实就三件事卡住时间各类 timeout、卡住大小max_body_size 与头部上限、兜住异常事件系统与 500 兜底。把这 8 个最佳实践落实到配置与回调中你的 Erlang web 服务器就能在保持轻量高性能的同时稳稳扛住恶意流量与意外崩溃。别忘了先 clone 项目源码在src/elli.erl和src/elli_http.erl里逐行读一遍默认逻辑你对安全边界的掌控会完全不同。仓库地址https://gitcode.com/gh_mirrors/ell/elli【免费下载链接】elliSimple, robust and performant Erlang web server项目地址: https://gitcode.com/gh_mirrors/ell/elli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表