fix(honeypot): 清洗反代链路的脏路径,回环来源 IP 打配置告警
测试环境实测(Cloudflare → nginx → 源站)发现两处: 1. 凭据文件里记录的 path 是 " /wp-login.php"(前导空格); 2. 来源 IP 记成 127.0.0.1。 path:Match 内部会 TrimSpace 所以仍能命中,但落库与假表单 action 用的是原始 req.URL.Path —— 取证数据带脏字符,爆破脚本还可能把表单提交到错误路径。 新增 cleanPath(trim + 补前导斜杠,不改大小写) 在 Serve 入口清洗一次。 IP:记录到回环地址说明站点在反代后面但 [security] trust_proxy 未开启。 此时所有访客在源站眼里是同一个 IP:取证数据失去意义,且一次蜜罐封禁会 连带封掉整站(含普通访客)。新增一次性 WARN(24h 冷却),只提示不改行为 —— 本地直连调试时回环 IP 属正常。sample.ini 的 trust_proxy 段补对应说明。 测试:TestCleanPath / TestIsLoopbackIP 覆盖前导空格、制表符、空串、 无前导斜杠、大小写保持,以及 shared.LimitKey 折叠后的 "::/64" 形式。
This commit is contained in:
@@ -74,6 +74,47 @@ func newHoneypotTestServerFull(t *testing.T, enabled, autoBan bool, cs honeypot.
|
||||
return ts
|
||||
}
|
||||
|
||||
// TestCleanPath 覆盖反代链路可能带来的脏路径。
|
||||
//
|
||||
// 实测 Cloudflare → nginx → 源站 上出现过 " /wp-login.php"(前导空格)。
|
||||
// Match 内部会 TrimSpace 所以仍能命中,但落库值与假表单 action 用的是原始值:
|
||||
// 取证数据变脏,爆破脚本还可能把表单提交到错误路径。
|
||||
func TestCleanPath(t *testing.T) {
|
||||
cases := map[string]string{
|
||||
"/wp-login.php": "/wp-login.php",
|
||||
" /wp-login.php": "/wp-login.php",
|
||||
"\t/wp-login.php": "/wp-login.php",
|
||||
"wp-login.php": "/wp-login.php",
|
||||
"": "/",
|
||||
" ": "/",
|
||||
"/ADMIN": "/ADMIN", // 不改大小写:URL 路径大小写敏感
|
||||
}
|
||||
for in, want := range cases {
|
||||
if got := cleanPath(in); got != want {
|
||||
t.Errorf("cleanPath(%q) = %q, want %q", in, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestIsLoopbackIP 覆盖回环判定(含 LimitKey 折叠后的 IPv6 形式)。
|
||||
func TestIsLoopbackIP(t *testing.T) {
|
||||
cases := map[string]bool{
|
||||
"127.0.0.1": true,
|
||||
"127.1.2.3": true,
|
||||
"::1": true,
|
||||
"::": true,
|
||||
"::/64": true, // shared.LimitKey 折叠 IPv6 后的形式
|
||||
"8.8.8.8": false,
|
||||
"203.0.113.9": false,
|
||||
"": false,
|
||||
}
|
||||
for ip, want := range cases {
|
||||
if got := isLoopbackIP(ip); got != want {
|
||||
t.Errorf("isLoopbackIP(%q) = %v, want %v", ip, got, want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TestHoneypotServesFakeLoginPage 验证:命中诱饵路径时返回假登录页(含 canary),
|
||||
// 而不是 302 跳首页。
|
||||
func TestHoneypotServesFakeLoginPage(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user