小工具最宝贵的产物不是代码量,而是把模糊的观察需求变成明确的数据模型。
成熟代理工具功能强大,但也隐藏了大量默认行为。写一个最小观察器不是为了替代它们,而是为了亲自处理请求行、头字段、消息体与时间信息。
01只选择一个问题
这个版本只回答:同一个客户端在短时间内向哪些主机发送了请求?不做漏洞扫描,不自动修改流量,也不承诺支持所有 HTTP 变体。清楚地拒绝范围,比堆积功能更重要。
event = {
"seen_at": now_iso(),
"client": client_ip,
"method": request.method,
"host": request.headers.get("host"),
"path": request.path,
}
write_jsonl(event)02解析边界就是安全边界
重复头字段、异常空白、分块传输与内容长度冲突都会让“一个请求”的定义变得复杂。观察器应该记录自己无法可靠解析的输入,而不是悄悄猜测。