结论:三层里性价比最高的是「源站IP隐藏 + CDN/网关层频率限制 + 服务端动态水印」,前端那些禁用右键、Base64、Canvas 属于心理安慰;另外你贴的那段 Nginx 配置里 valid_referers none blocked 是个实打实的漏洞——none 就是放行"不带 Referer"的请求,而 curl 默认恰恰不带 Referer,等于给采集脚本开了后门。

展开说几个补丁。第一,防盗链要么严格版 valid_referers server_names *.yourdomain.com;(去掉 none/blocked),要么干脆别依赖 Referer,改用签名 URL。这里有个连带坑:加了 CDN 之后,limit_req_zone $binary_remote_addr 拿到的是 CDN 回源节点的 IP,不是真实客户端 IP,必须配 set_real_ip_from CDN段; real_ip_header X-Forwarded-For; 并把 XFF 透传打开,否则限频要么形同虚设(全站共用一个桶被打死),要么误伤所有用户。第二,你提到的一次性 Token 放 query 里会直接把 CDN 缓存命中率打到 0,每张图都回源。更稳的做法是:图片本体用长 TTL 公开缓存,另设一个 /sign 接口做鉴权后 302 跳到带短时效签名的 URL(签名放 path 段而非 query,避免日志和分享泄露),这样缓存和鉴权两头都保住。

第三,切片方案你自己也提到了拼接问题,防拼接得加上:分片文件用哈希随机命名、请求顺序乱序、每片请求绑定 session token、每片叠加轻微随机噪点(拼接后会有可见色差),或者更省事——服务端拼好再输出,只把"低清预览"给前端。第四,pHash 的指纹要在加水印之前对原图算一份、加水印之后再算一份,前者用于跨站追责,后者用于站内定位泄露源;汉明距离阈值 64 位 pHash 取 10 左右是对的,但对裁剪、拼接过的图会失效,建议同时存多尺度 DCT 特征。

最后一个常被忽略的坑:只做图片防护不做源站保护,攻击者扫到你的真实 IP 直接绕 CDN 打回源,前面所有策略全废——源站只允许 CDN 回源段访问,这是前置条件,不是可选项。