后端(实机 10.10.10.161 验证 host-binary 全链路 + 注入双路径 400): - Loki 版本号严格 ^\d+.\d+.\d+$ 校验并接入 Update 路径:version 拼进 SSH shell 命令, 旧校验放行 3.0.0'; id; echo ' 等注入载荷(root RCE) - Stop/Restart 清理清单移除 PVC:停止部署曾连带删除 loki-data PVC,filesystem 存储日志被永久清空(测试锁死红线) - 采集敏感路径防护覆盖默认 LogPath 分支与 collector Create(/etc/shadow 不再可绕过入库) - 数据文件损坏时原文件改名 .corrupt-* 留档再空库启动,不再被静默覆盖(loadFromDisk 抽出可测) 前端: - 审计页用户名过滤 300ms 防抖 + AbortController/版本号(逐键竞态数据错乱) - 向导自动部署改用创建返回实例(或 id 最大且 pending),不再盲取 list[0] 对错误实例发起真实部署 - 路由级 ErrorBoundary:单页崩溃/chunk 404 只影响当前页
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
package repository
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// TestInitDBCorruptedFileIsNotOverwritten 数据文件损坏时,原内容必须以 .corrupt-* 备份留档,
|
|
// 不允许被随后的空库落盘覆盖(可恢复数据销毁 = P0)。
|
|
func TestInitDBCorruptedFileIsNotOverwritten(t *testing.T) {
|
|
dir := t.TempDir()
|
|
dataFile := filepath.Join(dir, "lokistack.json")
|
|
corrupt := "{not valid json"
|
|
if err := os.WriteFile(dataFile, []byte(corrupt), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
d := &JsonDB{dataFile: dataFile}
|
|
d.loadFromDisk()
|
|
// 模拟启动后任意一次落盘:损坏原文若未被移走,这里就会覆盖它
|
|
if err := d.doSaveInner(); err != nil {
|
|
t.Fatalf("空库落盘失败: %v", err)
|
|
}
|
|
|
|
entries, err := os.ReadDir(dir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
backedUp := false
|
|
for _, e := range entries {
|
|
if strings.HasPrefix(e.Name(), "lokistack.json.corrupt-") {
|
|
content, readErr := os.ReadFile(filepath.Join(dir, e.Name()))
|
|
if readErr == nil && string(content) == corrupt {
|
|
backedUp = true
|
|
}
|
|
}
|
|
}
|
|
if !backedUp {
|
|
t.Fatalf("损坏原文未被完整备份留档: %v", entries)
|
|
}
|
|
}
|