安全加固:Web 登录防爆破(IP+用户名双维度限速 5次/分钟锁10分钟,未知用户名 dummy bcrypt 防枚举),瓦片代理 SSRF 加固(DialContext 拒绝内网/链路本地/CGNAT/ULA 与重定向限制,Content-Type image 白名单+nosniff),/api/discard-details 公开去敏(新增 admin 全字段端点),公开地图源接口外部 URL/key 一律代理化,install.sh 随机管理员密码+非回环默认口令拒绝启动,后端 v1.4.0

This commit is contained in:
2026-08-20 17:00:41 +08:00
parent fe0cf036cf
commit f21e8337af
13 changed files with 658 additions and 48 deletions
+28
View File
@@ -13,6 +13,7 @@ import (
"os/signal"
"runtime"
"strconv"
"strings"
"syscall"
"time"
@@ -359,6 +360,9 @@ func parseArgs() (*configpkg.Config, error) {
// run 创建 MQTT broker 和 Web 服务,并阻塞等待退出信号。
func run(cfg *configpkg.Config) error {
if err := guardDefaultAdminPassword(cfg); err != nil {
return err
}
store, err := storepkg.OpenStore(cfg.Database, cfg.ConsoleLog.SQL)
if err != nil {
return err
@@ -586,6 +590,30 @@ func startMQTTServer(cfg *configpkg.Config, store *storepkg.Store, dbQueue *stor
return server, hook, authHook, addr, nil
}
// guardDefaultAdminPassword 防止 Web 管理后台以默认口令监听非回环地址。
// 新部署请通过 MESH_ADMIN_PASSWORD 或在配置中修改 web.admin.password 后再启动。
func guardDefaultAdminPassword(cfg *configpkg.Config) error {
if !cfg.Web.Enabled || !cfg.Web.PortEnabled {
return nil
}
if cfg.Web.Admin.Password != "" && cfg.Web.Admin.Password != "admin" {
return nil
}
if isLoopbackHost(cfg.Web.Host) {
return nil
}
return errors.New("web.admin.password 仍为默认值 admin 且监听非回环地址,拒绝启动:请设置环境变量 MESH_ADMIN_PASSWORD 或修改配置 web.admin.password 后重试")
}
func isLoopbackHost(host string) bool {
switch strings.ToLower(strings.TrimSpace(host)) {
case "localhost", "127.0.0.1", "::1":
return true
default:
return false // 空值会绑定全部网卡,按非回环处理
}
}
// printJSON 将记录编码为 JSON 后按数据包类型着色输出。
func printJSON(record map[string]any) {
printJSONBytes(record, mqtpp.MustJSON(record))