Echo 的 MaxRequestBodySize 对路径扫描无效,因扫描仅用 URL 路径无请求体;应通过 HTTPErrorHandler 拦截未注册路由返回 403 或 200 隐蔽响应,前置中间件匹配恶意路径黑名单,并联动日志与速率限制实现闭环防护。

为什么 Echo 的 MaxRequestBodySize 对扫描无效
路由扫描(如 GET /owa/auth/logon.aspx、GET /.env)不发请求体,只靠 URL 路径触发,所以任何基于请求体大小的限制(比如 e.MaxRequestBodySize(50 * 1024 * 1024))完全不生效。它防的是大文件上传或 JSON 爆破,不是路径探测。
用 echo.HTTPErrorHandler 拦非注册路由
Echo 默认对未匹配路由返回 404,但攻击者正是靠 404 响应确认路径存在。你需要主动拦截所有未注册路径,统一返回 403 或伪造响应,避免暴露真实路由结构。
实操建议:
- 在
e.HTTPErrorHandler中判断err.Error()是否含"code=404"或检查c.Path()是否不在白名单内 - 不要直接返回
c.String(404, "Not Found")—— 攻击工具会把 404 当“命中”信号 - 推荐返回
c.String(403, "Forbidden")或更隐蔽的c.String(200, "OK")(配合空 body) - 可加随机延迟(
time.Sleep(50 * time.Millisecond)),打乱扫描节奏
前置中间件过滤高频恶意路径
比等路由匹配后再处理更早——在 e.Use() 阶段就做路径黑名单匹配,能快速拒绝已知扫描特征,减少框架内部开销。
常见要拦的路径模式:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
/shell、/cgi-bin、/phpmyadmin -
/.env、/.git/config、/wp-config.php -
/cdn-cgi/trace、PRI * HTTP/2.0(HTTP/2 预检扫描) - 含 shell 字符串的 query:
?cd+/tmp;rm+-rf+*、wget%20http://
示例逻辑(不依赖正则,避免回溯):
func blockScanPaths(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
path := c.Request().URL.Path
query := c.Request().URL.RawQuery
full := path + "?" + query
<pre class="brush:php;toolbar:false;"> for _, bad := range []string{
"/.env", "/.git/config", "/owa/auth/", "/shell?",
"wget%20http://", "cd+/tmp", "PRI * HTTP/2.0",
} {
if strings.Contains(full, bad) {
return echo.NewHTTPError(http.StatusForbidden)
}
}
return next(c)
}}
别忘了日志和速率限制联动
单靠拦截不能替代可观测性。Echo 本身不带 IP 级限流,必须自己集成或用反向代理(如 Nginx)补上。
关键点:
- 记录所有 403/404 请求的
RemoteIP()和Path(),尤其关注同一 IP 短时间高频 404 - 避免在
HTTPErrorHandler里记日志——它可能被 panic 触发多次,导致重复写入 - 推荐在自定义中间件中统一记录,并用
sync.Map或 Redis 统计 IP 请求频次 - 真正有效的防护是「拦截 + 日志 + 外部 WAF/IP 黑名单同步」三者闭环,仅靠 Echo 层做不到根治










