“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
Claude Code 隐写术标记:藏在系统提示词里的指纹
本文揭露了 Claude Code 2.1.196 中通过 Unicode 变体和日期格式变化,将 API 代理/转发域名分类信息隐写进系统提示词的机制,并分析了其合理性与风险。
Claude Code 隐写术标记:藏在系统提示词里的指纹
原文链接:https://thereallo.dev/blog/claude-code-prompt-steganography
背景:为什么我要审视 Claude Code?
我的出发点很朴素——出于隐私考量。几乎所有的 AI 编程助手(harness)都被开发者授予了过分的权限:文件系统读写、Shell 执行、Git 操作、浏览器控制,甚至最近的"计算机使用"能力。这固然是这类工具的设计初衷——没有足够上下文,它们就无法胜任实际工作。
但权限越大,审查义务越大。 如果某个编码智能体既能读你的仓库,又能跑命令,那么它本身的二进制文件就应该尽量"无趣"(boring),不应包含任何意外逻辑。比如 Raspberry Pi 官方的 pi harness 就是这种极简主义的例子。带着这种标准,我审视了自己本地安装的 Claude Code 2.1.196 的代码。
发现:系统提示词中的隐形标记
在 Claude Code 二进制内,存在一个函数,它会悄悄修改被插入系统提示词(system prompt)的当前日期字符串。正常情况下,这段字符串长这样:
text
Today's date is 2026-06-30.
但我发现,这段句子可以被静默地改动两个不起眼的细节:
Today's中的撇号(')- 日期分隔符,从
-(连字符)改为/(斜杠)
下面是相关函数的还原代码(从压缩混淆的代码中清理后):
js
function Zup() {
if (Crt()) return null;
let host = Qup();
let timezone = e0t();
let cnTZ = timezone === "Asia/Shanghai" || timezone === "Asia/Urumqi";
if (!host) {
return { known: false, labKw: false, cnTZ, host: null };
}
return {
known: Jup().some((domain) => host === domain || host.endsWith("." + domain)),
labKw: Xup().some((keyword) => host.includes(keyword)),
cnTZ,
host,
};
}
function edp(known, labKw) {
if (!known && !labKw) return "'"; // 普通撇号 U+0027
if (known && !labKw) return "\u2019"; // 右单引号 U+2019
if (!known && labKw) return "\u02BC"; // 修饰符字母撇号 U+02BC
return "\u02B9"; // 修饰符字母短撇号 U+02B9
}
function Vla(date) {
let marker = Zup();
let apostrophe = edp(marker?.known ?? false, marker?.labKw ?? false);
let renderedDate = marker?.cnTZ ? date.replaceAll("-", "/") : date;
return Today${apostrophe}s date is ${renderedDate}.;
}
这就是提示词隐写术(Prompt Steganography):把数据藏在肉眼可见的文本里。模型和用户看到的都是一句平平无奇的日期叙述,但原始 HTTP 请求里却包含着一个编码后的分类标记。
触发条件:请求从哪里来?
隐写标记不是对所有人触发的。它的触发开关是环境变量 ANTHROPIC_BASE_URL——这是 Claude Code 提供的 API 地址覆盖接口。相关逻辑如下:
js
function Crt() {
let baseUrl = process.env.ANTHROPIC_BASE_URL;
if (!baseUrl) return true; // 未设置则提前返回
return Rrt(baseUrl);
}
function Rrt(baseUrl) {
try {
let host = new URL(baseUrl).host;
return ["api.anthropic.com"].includes(host); // 官方 API 直接放行
} catch { return false; }
}
function Qup() {
let baseUrl = process.env.ANTHROPIC_BASE_URL;
if (!baseUrl) return null;
try { return new URL(baseUrl).hostname.toLowerCase(); }
catch { return null; }
}
只有当 ANTHROPIC_BASE_URL 指向非官方端点时,Zup() 才会继续往下走。接下来,它查询两个条件:
- 系统时区是否为
Asia/Shanghai或Asia/Urumqi(即中国时区)。若是,则将日期格式从2026-06-30改写为2026/06/30。 - API 的 hostname 是否命中解码后的域名列表或AI实验室关键词列表。若是,则改变撇号类型。
撇号变体对应的四种状态一目了然:
| 条件 | 使用的字符 | Unicode |
|---|---|---|
| 正常(非已知域名、非实验室关键词) | ' |
U+0027 |
| 已知域名(代理/分销商/网关)但非实验室关键词 | '(右单引号) |
U+2019 |
| 非已知域名但含实验室关键词 | ʻ(修饰符字母转义符) |
U+02BC |
| 既是已知域名又含实验室关键词 | ʹ(修饰符字母素数符号) |
U+02B9 |
在绝大多数等宽字体(mono fonts)中,这些字符的视觉差异小到几乎不会被注意到,但对于解析字符串的后端,它们是完全不同的字节序列。
混淆的域名列表:base64 + XOR
更值得玩味的是存储方式。域名和关键词列表并非明文存放,而是以 base64 字符串编码,再用固定值 91 做 XOR 解码:
js
var Kup = 91;
function Gla(encoded) {
let bytes = Buffer.from(encoded, "base64");
let out = "";
for (let byte of bytes) {
out += String.fromCharCode(byte ^ Kup);
}
return out.split(",");
}
解码后的实验室关键词列表是:
text
deepseek, moonshot, minimax, xaminim, zhipu, bigmodel, baichuan, stepfun, 01ai, dashscope, volces
一眼望去,全是中国的 AI 大模型创业公司(幻方DeepSeek、月之暗面、MiniMax、智谱AI、百川智能、阶跃星辰、零一万物、阿里云DashScope、火山引擎等)。
解码后的域名列表则大得多,涵盖中国大型企业域名、AI公司域名,以及大量代理/转售/网关类域名。例如:
text
.baidu.com
.alibaba-inc.com
.alipay.com
.antgroup-inc.cn
.bytedance.net
.kuaishou.com
.xiaohongshu.com
.jd.com
.bilibili.co
.iflytek.com
.stepfun-inc.com
.moonshot.ai
.anyrouter.top
.claude-code-hub.app
.claude-opus.top
.openclaude.me
.proxyai.com
.yunwu.ai
.zenmux.ai
完整的域名列表见作者的静态资源文件:
👉 完整域名列表
可以看出,这些域名涵盖了三类人:
- 大型中国企业(他们可能是 Claude 的API大客户)
- 其他AI公司(有可能在做模型蒸馏/知识迁移)
- Claude Code 的转售商和第三方代理平台
标记如何被传递
这个日期函数的结果会被拼接到构建上下文的对象中,作为系统上下文(system context)发送给模型:
js
{
...(userEmail && { userEmail: The user's email address is ${userEmail}. }),
...(attachedProject && { attachedProject }),
currentDate: Vla(GSe())
}
也就是说,每次请求发往 Anthropic 后端时,这个"看似普通"的日期字符串就已经携带了隐秘的分类信号。Anthropic 的后端可能专门有解析逻辑来读取这个字段(作者推测,且大概率属实)。
我本机的情况
为了验证,我检查了自己机器上的安装包签名和运行环境:
text
Identifier=com.anthropic.claude-code
TeamIdentifier=Q6L2SF6YDW
Timestamp=Jun 29, 2026
SHA256=6fc6e61ab7582c2bf241225ff90d9f79e91d69380cb9589fc9dedd3a30070f5a
我的 shell 环境没有设置 ANTHROPIC_BASE_URL,时区是 Asia/Hong_Kong。香港不在中国的时区清单(Asia/Shanghai 和 Asia/Urumqi)里。因此,在我的机器上,这个路径会产出完全正常的撇号和正常格式的 YYYY-MM-DD 日期——这个特性对我而言是处于未激活状态的。
分析:动机合理,实现诡异
可能的动机
Anthropic 做这件事,大概率是为了检测和服务治理:
- 检测 API 转售商(reseller):很多人买 API Key 然后转卖或代调用,没有官方授权。
- 检测未经授权的 Claude Code 网关(gateway)。
- 检测所谓的"模型蒸馏攻击"流水线——即用大模型生成数据去训练自家小模型,尤其是用 Claude 的输出教导 DeepSeek、Qwen 这类竞品模型的行为。
一个指向已知转售域名或包含 deepseek、zhipu 等关键词的 ANTHROPIC_BASE_URL,确实是一个非常有价值的信号。从安全/商业角度,这个动机是完全成立的。
为什么实现方式令人不适?
问题出在实现路径上,它过于隐蔽,违背了一个开发工具理应追求的"透明且无聊"的特质。具体有三点:
- 静默篡改系统提示词:使用肉眼近乎无法分辨的 Unicode 变体字符来编码信息。
- 把代理/网关的分类结果藏在一句看似普通的英文句子中。如果你只关心响应内容或日志明文,根本不会注意到。
- 将域名列表用 XOR + base64 进行混淆。虽然不是不可逆,但这种做法表明设计者不想让别人轻易读懂。
如果仅仅是为了检测异常行为,完全可以:
- 在 API 请求中加入明确的 telemetry 字段(如
client_marker: gateway),并在文档中公布。 - 在释放说明(release notes)里写明策略。
- 在客户端启动时打印一条警告,告知用户它将探测其 API 网关并标记请求。
隐藏信号的代价,是让其他一切隐私承诺都变得不可信。 毕竟,编程智能体本身就已经站在一个令人恐惧的权限边缘:它可以读代码、偶尔泄露密钥、执行 Shell 命令、安装包、修改文件、推送提交。开发者接纳这些,是因为产出收益足以抵消风险。但开发者永远有权利知道:这个工具在对话的背后,偷偷记录了什么关于我的信息,又是如何记录的。
实际影响:谁会受影响?
对绝大多数普通用户而言,这条路径是不激活的。因为:
- 使用官方 API 端点(
api.anthropic.com),Crt()提前返回。 - 未设置
ANTHROPIC_BASE_URL,Crt()直接返回。 - 没有显式配置自定义网关,网络环境一切正常。
真正受影响的是那些通过自定义 base URL 路由请求的人,包括:
- 企业内部网关(internal gateway)
- 本地代理(local proxy,如 caching proxy)
- 模型路由器(model router,如 LiteLLM)
- 转售商(reseller)
- 各类研究用实验设置
这些人会被 Claude Code 默默分类,并在每次对话的 prompt 中留下指纹。讽刺的是,绕过这一机制极其容易:改一下 hostname、修改系统时区、patch 二进制、或者用 wrapper 进程过滤——任何真正有敌意的攻击者都能轻易让这个信号失效。
所以这个功能实际上惩罚的,并非恶意利用者,而是那些容易留下指纹的正常开发者——他们可能只是出于合规要求或成本优化,在做一些合法但非主流的设置。这本身就说不过去。
最后的评价
商业公司保护自己的模型和服务不被滥用,完全正当。API 提供方确实可以检测滥用行为;开发者工具的条款和策略也当然可以声明。但关键在于:一个能访问你文件系统和 Shell 的工具,一旦开始把分类信息藏在不可见的标点符号里,用户唯一正确的反应就是质疑。
信任,是建立在"无聊"的部分之上的。当有趣的部分越过了边界,信任也就不再存在。
总结一句话:Claude Code 的这项特性在安全设计上是可解释的(对API滥用做信号采集),但在实现方式上是不可接受的——它把隐写术用在了所有用户的每次请求中,无论用户是否同意,且事先未有披露。开发者应当知晓这一点,并据此评估自己对这类工具的信任边界。
原文链接:https://thereallo.dev/blog/claude-code-prompt-steganography