上一版只用 strings.TrimSpace,实测漏掉「看不见但不算 White_Space」的字符:
cleanPath("\u200b/wp-login.php") = "/\u200b/wp-login.php"
(零宽没被删,还因为首字符不是 '/' 多补了一个斜杠,拼出更怪的路径)
改为 TrimFunc 同时匹配 unicode.IsSpace 与 U+200B/200C/200D/FEFF,且只处理首尾
—— 中间的零宽字符可能是攻击 payload,取证要保留原样。
另加诊断日志:清洗前后不一致时 WARN,用 %q 打出原始值。
测试环境出现过「记录里 path 带前导空白、本地链路却复现不出来」的情况,
不可见字符必须转义输出才定位得到。
测试:TestCleanPath 补零宽空格 / BOM / 中间零宽字符保留三个用例。
2.0 KiB
2.0 KiB
构建与测试(长版明细)
构建与测试
- 无 libwebp/GCC:cgo 的
internal/storage/s3.go挡编译 → overlay 换桩dev/s3stub/s3_stub.go(-overlay="C:/Users/Tamakyi Gekka/AppData/Local/Temp/tb-webpcheck/overlay.json")。 要检查 s3.go 本身得 tar 复制项目 +go mod edit -replace(overlay 换不了 GOMODCACHE)。 - 「编译卡死」=
proxy.golang.org不可达。每条 go 命令前export GOPROXY=https://goproxy.cn,direct GOSUMDB=off GOFLAGS=-mod=mod(go env -w沙箱失败)。 1C1G 是正式生产环境,别用「沙箱慢」解释超时。 - DB 测试:
DB_TYPE=postgres DB_USER=postgres DB_PASSWORD=15207786347hXPm DB_HOST=127.0.0.1 DB_PORT=5432(DSN 不带库名,NewTestDB自建临时库后 DROP)。带 DB 的go test ./...全绿。 - store 方法内用
NewXStore(db.DB),别引用包级单例(测试下 nil panic;FeatureStateOf有守卫)。 - ⚠️ 本沙箱起不了
TamaBox web(session 固定 redis,6379 未开,启动 panic)→ HTTP 端到端只能部署后做。 探测端口 200 可能是别的进程,必须看日志确认Starting web server且无 panic。 - ⚠️ 本机 python urllib 不稳定(代理下偶发读超时,curl 正常);python 别用
/tmp(Windows 解析成C:\tmp,与 MSYS 不通)。PIL 在~/.workbuddy/binaries/python/envs/default。 - ⚠️ 验证 Go 二进制里有没有某个中文字符串,不能用
strings:GNU strings 默认只输出 可打印 ASCII(0x20–0x7E),UTF-8 中文(0xE4+ 开头)整段被丢弃,strings x | grep 中文恒为 0 —— 曾据此误判「用户没重新编译」,实际二进制是新的。 正确做法:grep -ac "中文字符串" 二进制文件(实测同一个二进制:strings=0、grep -a=1)。 - ⚠️ 替换二进制后必须重启进程:
go build -o X只改磁盘文件,正在跑的进程仍是旧映像。 若服务由 systemd/supervisor 管理,再手动./X web会因端口被占直接退出。