构建

行车记录仪 — 不碰一帧影像

作者: makemind · 2026年4月9日

行车记录仪装着车里最敏感的东西。可是 除了视频,其余全是普通的运营数据。 今天跑了几趟、卡还剩多少、碰撞检测是不是敏感到每个减速带都触发。都是车队管理者每天要看的东西。

把这个做成应用,常见的路子只有一条:做一个什么都返回的 API,只在视频端点前面立一道权限检查。

那道检查 只要有人删掉就没了。 赶工的发布里、重构途中、为了让测试通过。删掉之后其余照样跑,所以没人发现。

工具清单就是表面

这个样例的记录仪提供的全部:

the dashcam offers: trips.list, camera.settings, camera.set_sensitivity
  trips.list — Trips recorded today, with duration, distance and impact counts
  camera.settings — Read the impact sensitivity and the card space
  camera.set_sensitivity — Set impact sensitivity, 1 (least) to 5 (most)

三个。返回视频的工具不是被锁住了,是不存在。

这和权限检查性质不同。检查是代码,代码可以删。不存在的工具 连要调用的对象都没有。 前端写得再糟、令牌漏得再远,不在清单上的东西不会被调用。

clip 只走句柄

那视频怎么办?每一行行程各带一个句柄。

clips referenced: clip:8841, clip:8842, clip:8843, clip:8844
TODAY · 4 TRIPS · 124.4 km — 4 趟行程,2 趟带碰撞标记,每行一个 clip 句柄
TODAY · 4 TRIPS · 124.4 km — 4 趟行程,2 趟带碰撞标记,每行一个 clip 句柄

clip:8842 不是文件名,而是一个 不透明的句柄。这个服务端拿它什么也打不开。它是给站在车前、有权查看的人用来找那段片子的,同时也是 这个服务端从未读过视频的证据

句柄走了和内容走了,是完全不同的两件事。看日志就能分辨——留句柄就是为了这个。

视频也会从句子里漏出去

再往前一步。视频不只以文件的形式泄露。

「摄像头看到什么的摘要」,就是被句子洗过的视频。 把车牌读出来给成文本,不等于没给视频。数一数走过几个行人再给,也是一样。

所以服务端自己堵住自己的输出。

/// Words this server must never emit. Footage leaks by being described as
/// much as by being served: a "summary of what the camera saw" is the video,
/// laundered through a sentence.
static const forbidden = [
  'plate', 'licence', 'license', 'face', 'pedestrian', 'frame',
  'thumbnail', 'preview', 'snapshot', 'image', 'footage of',
];

撞上这份清单,就在组装响应的途中抛出。不悄悄抹掉——抹掉了下次还会再放进来。

校验会把服务端吐出过的所有字符串都扫一遍。

no footage-describing vocabulary in anything the server returned

摄像头自己夹住自己

灵敏度是 1 到 5。屏幕上有一个按钮故意 要 9。

{ "type": "button", "label": "More sensitive",
  "onTap": { "type": "tool", "tool": "camera.set_sensitivity",
             "params": { "level": 9 } } }
asked for level 9 -> 5 of 5 ("sensitivity now 5")
impact sensitivity 5 of 5 · sensitivity now 5
impact sensitivity 5 of 5 · sensitivity now 5

摄像头夹住了。

// The camera clamps to its own range. A fleet console asking for 9
// gets 5, and is told so.
if (v < 1) v = 1;
if (v > 5) v = 5;

也可以在屏幕这边加 min/max。那是 礼貌,不是安全。屏幕是 JSON,JSON 每次发布都会变,而变过的屏幕总有一天会送错值。最后接住的那一层,必须永远是冻住的那一侧。

而且它会告诉你夹过了。悄悄设成 5,管理者就会一直以为是 9。

此内容需要开发者或更高等级

登录并升级您的方案即可继续阅读。

查看方案
Twitter