惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
CERT Recently Published Vulnerability Notes
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cyberwarzone
Cyberwarzone
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
GbyAI
GbyAI
Security Latest
Security Latest
Last Week in AI
Last Week in AI
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
Webroot Blog
Webroot Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
C
Cisco Blogs
博客园 - 【当耐特】
Blog — PlanetScale
Blog — PlanetScale
Hugging Face - Blog
Hugging Face - Blog
B
Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
The Last Watchdog
The Last Watchdog
U
Unit 42
阮一峰的网络日志
阮一峰的网络日志
Project Zero
Project Zero
WordPress大学
WordPress大学
L
LINUX DO - 最新话题
F
Fortinet All Blogs
L
LINUX DO - 热门话题
PCI Perspectives
PCI Perspectives
Simon Willison's Weblog
Simon Willison's Weblog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
The Hacker News
The Hacker News
爱范儿
爱范儿
O
OpenAI News
J
Java Code Geeks
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More

pseudoyu

周报 #106 - OpenClaw 实践、搬家与生活的能量 周报 #105 - 打破无聊的社会 2025 年末回顾 - Anything different is good 周报 #104 - 被遗忘的生活一隅 周报 #103 - 工作随想与被吞噬的生活 周报 #102 - 我是如何使用 AI 的 周报 #101 - 消失了三个月,我的生活发生了什么变化 周报 #100 - 过去这十年 周报 #99 - 离开 RSS3,迷茫与重启人生 周报 #98 - 生活之书与 Agentic Coding 周报 #97 - 日本旅行小记 28 岁的自白:去找寻自己 周报 #96 - 基于 Roo Code/Cursor 的 iOS 开发工作流 周报 #95 - All AI 与 No AI 周报 #94 - 生活的界限与真实感 周报 #93 - 婚礼纪录片与失落的电影院 周报 #92 - 数码产品 Porn 与断舍离 周报 #91 - 一席、消失的时代与自由意志 周报 #90 - OVH 服务器、Coolify 与对 AI Coding 的思考 周报 #89 - 博客改版与 TheWan App 发布 周报 #88 - 方大同、《回留》与人生清单 周报 #87 - 我们主持了自己的宝可梦婚礼,还为它办了一个展 周报 #86 - 用影像打败时间 周报 #85 - 京华烟云 Moment in Peking 周报 #84 - 想起他们 Echos of Reverie 周报 #83 - 年初收纳(房间、设备、服务、软件) 周报 #82 - Brand New Year 与写日记 2024 年末回顾 - 不完美的日子 周报 #81 - Engaged -> Married 与时间的尺度 周报 #80 - 关于求婚、爱情与婚姻 求婚誓言 | 爱的本质是被看见 周报 #79 - 清迈旅居、曼谷之行与 Follow RSSHub 开发实践 #01:Telegram 频道 RSS 订阅实现与部署方案 Follow —— 信息获取的另一种形态 周报 #78 - NAS、Chromebook 与 Zeabur 折腾小记 周报 #77 - 一间只属于自己的房间(对亲密关系的思考) 周报 #76 - 关于 Adulting 的思考 周报 #75 - 回答 Dayu 关于独立博客的 9 个问题 周报 #74 - 清迈异闻录 周报 #73 - 《社交网络》、Ego 与中秋的现充生活 周报 #71 - Indie App 体验计划 周报 #70 - 消失的附近,Burnout 与 Boreout 周报 #69 - AI Coding 体验与学习的源动力 周报 #68 - 关于写博客这件事与我生活的色彩 使用 GoatCounter 与 Zeabur 搭建网站数据统计系统 周报 #67 - 使用 follow 重塑我的信息输入系统 周报 #66 - 10x 工程师、技术热情与个人工具箱 从零开始搭建你的免费博客评论系统(Remark42 + fly.io) 周报 #65 - Adventure X 体验、Apple Notes 笔记实践与 EpubKit 周报 #64 - 生活在此处(《斯通纳》与《Normal People》) 当云服务器崩溃时,我是如何救援重要数据的 周报 #63 - 不愉快的订花经历、商家和消费者与日渐 AI 化的人 从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud) 2024 年了,我的博客有了什么变化 周报 #62 - 香港之行、5am club 计划与 Rust 学习 周报 #61 - 好朋友的婚礼与对婚姻的思考 27 岁的自白:成长是一件很扫兴的事 周报 #60 - 虫子旁、教育理念与 EpubKit 周报 #59 - 沙漠之行、家庭与家人 周报 #58 - 远程工作这一年 周报 #57 - 生活在别处(巴厘岛之行) 周报 #56 - 面基 Randy 与考科目二 周报 #55 - 油画体验、博客系统升级与对 self-hosting 的思考 周报 #54 - 漂流计划、钱包被盗与 Home Server 周报 #53 - 空白的三个月、生活漂流与春节 周报 #52 - 自谦型人格与感情的另一个视角 周报 #51 - 追星小鹿 Lawrence 与生病 周报 #50 - 天坛漫步、重拾阅读和费曼学习法 周报 #49 - 烧焦的键盘、庞贝神话展、健康调整与神奇的梦 周报 #48 - 内蒙之行、清迈游民、重启的周报与生活 周报 #47 - 采访、拳击与工作状态 周报 #46 - 告别长发、周报初心与合约开发 个人信息获取与知识管理系统(Heptabase + Logseq + Readwise) 周报 #45 - 读书笔记、知识管理与双城生活 周报 #44 - 静寂工人、xLog 与日常 周报 #43 - In the Mood for Love 周报 #42 - 感情观、生活状态与自我 周报 #41 - 生日的仪式感、时间管理与北京之行 26 岁的自白:推石头的人 周报 #40 - 开源之夏、代码之外与流逝的睡眠 周报 #39 - 初患新冠、过去的心绪与失而复得的分享欲 周报 #38 - Foundry、Logseq 与 Surge Ponte 周报 #37 - 浮生半月闲( 武汉 | 香港 | 五月天) 周报 #36 - 肠胃炎、捏捏近况与新的旅途 周报 #35 - 登报、搬家和生病的捏捏 周报 #34 - Don't Stop the Clocks 周报 #33 - 北京 x 故事 x 离别 周报 #32 - 武汉、久别重逢与流动的心绪 周报 #31 - 开源、前端开发与 ChatGPT 实践 周报 #30 - 开源预算、写作初心与对技术的谦卑 Cosmos 区块链架构与 Tendermint 共识机制 周报 #29 - 日语学习经验、Steam Deck 与居酒屋 周报 #28 - Mastodon、故乡与捉迷藏的猫 周报 #27 - 何以为家 周报 #26 - 博客、客制化键盘和新服务器 周报 #25 - 基于 Crossbell 的个人信息输出与同步系统(重构) 摄影集 #02 - Moment In Peking (The Autumn) 摄影集 #01 - Cat In The Box 2022 年末回顾 - 迷茫、低谷与改变 周报 #24 - Love Actually | 真爱至上
使用 WebP Cloud 与 Cloudflare WAF 为你的图床添加隐私和版权保护
pseudoyu · 2024-07-01 · via pseudoyu

前言

在「从零开始搭建你的免费图床系统 (Cloudflare R2 + WebP Cloud + PicGo)」一文中,我用 Cloudflare R2 搭建了一个免费的图床系统,并通过 WebP Cloud 进行图片优化。

在使用 WebP Cloud 的过程中,我发现它还提供了自定义 Proxy User Agent、水印等功能,于是萌生了一个想法,是不是可以通过 WebP Cloud 对我的图床源站链接进行保护,使 WebP Cloud 的代理链接成为访问我所有图片的唯一入口,并统一添加我的专属版权水印。

本文是对这一实践的记录,也算是图床搭建番外篇了。

需求分析

webp_proxy_info

我目前的图床方案是将图片都托管在 Cloudflare R2 上,并且通过 WebP Cloud 这一强大的图片代理工具进行访问优化,但其实使用代理链接 image.pseudoyu.com 与源站链接 images.pseudoyu.com 都可以访问我的图片,只是前者被优化过,后者则是我保存的原图。

隐私保护

事实上我们通过手机、数码相机等设备拍摄的照片都会携带 EXIF(EXchangeable Image File Format) 信息,通常会包含拍摄设备、时间和地点等敏感信息,我们可以通过一些技术方式手动去除这些元数据,但操作十分繁琐且容易遗漏。

webp_exif_remove

我查阅了一下 WebP Cloud 的文档,发现它果然提供自动擦除 EXIF 信息的功能,无须额外配置操作,但其实访客依然可以可以通过 Cloudflare R2 暴露出的源站信息访问到原图,为了避免这一点,我需要限制用户只能通过 WebP Cloud 代理链接进行请求,访问 Cloudflare R2 源站链接时获取不到任何有用信息。

版权保护

randy_pic_copyright

之前在推上看到 Randy 自己拍的 desk setup 图被盗用的经历。

而自己也玩一些摄影,虽没什么特别的商业价值,但终究是自己的作品,理应保护版权,因此我想在图片上统一添加自己的版权水印,以防止被他人盗用。

实现方案

需求清晰了,其实主要分为两部分:

  1. 让用户只能通过 WebP Cloud 代理链接访问到我的图片,禁止直接访问原图链接
  2. 在 WebP Cloud 代理层面为所有的图片统一自动添加自己的版权水印,无须手动操作

以下是我的实现方案与详细步骤。

WebP 自定义 User Agent + Cloudflare WAF

WebP Cloud 的开发者 Nova Kwok 聊了一下,发现 WebP Cloud 提供了自定义「Proxy User Agent」的功能,并推荐在 Cloudflare WAF 中配置对应规则以保护图片安全,文档中有详细说明 – 「Security | WebP Cloud Services Docs」。

WebP Cloud 配置

当我们访问互联网上的网页或图片链接时,请求通常会包含一个 User Agent 字段,一般包含浏览器版本等信息,网站可针对不同的 User Agent 进行一些特定逻辑处理。

WebP Cloud 默认会使用 WebP Cloud Services/1.0 作为值,也就是不论用户访问图片时使用的是什么终端设备和浏览器,请求到 Cloudflare R2 时都会被统一为 WebP Cloud 定义的 User Agent 值,而这个值又是用户可以自定义的。

webp_custom_user_agent

因此,我们登录 WebP Cloud 的控制台,将「Proxy User Agent」字段设置为一个自定义值,如 pseudoyu.com/1.0

Cloudflare WAF 配置

cloudflare_waf_intro

WAF(Web Application Firewall) 是 Cloudflare 提供的一个防火墙服务,可以自定义规则来限制特定请求以保护网站安全,登录 Cloudflare 后在左侧边栏点击「网站」,点击进入需要保护的域名,选择侧边栏「安全性」 - 「WAF」即可免费使用(注:不是最外层的账户级 WAF),免费账户可设定五个自定义规则。

waf_create_rule

点击「创建规则」,进入设置页面。

user_agent_protection_waf

点击「表达式预览」右侧的「编辑表达式」,填入以下规则:

(http.user_agent ne "pseudoyu.com/1.0") and (http.host eq "images.pseudoyu.com")

首先,需要把其中 pseudoyu.com/1.0 这部分填入上文在 WebP Cloud 中你自定义的 User Agent 值;另外,为了防止我在同一域名下的其他自部署服务的图片无法正常显示,我添加了 (http.host eq "images.pseudoyu.com") 条件,即只对图床的访问链接生效,这部分需要替换为自己的图床域名 host。

并且在「选择操作」下拉选择「阻止」,这样会匹配我们的规则并阻止特定网络请求,编辑完成后点击「部署/保存」即可。

我使用的是目前 WebP Cloud 官方文档提供的推荐规则,后续或许会针对新的功能有所调整,可以直接参考文档。

block_by_waf_example

完成配置后,当我们再次访问以 images.pseudoyu.com 开头的源站链接时会被 WAF 拦截,例如:

images.pseudoyu.com/images/new_mbp_setup.jpg

而经 WebP Cloud 代理过的链接则可以正常访问,例如:

image.pseudoyu.com/images/new_mbp_setup.jpg

完美实现了我们的需求。

使用 WebP Cloud 为图片添加版权水印

经过了上文的操作,我们已经确保用户只能经过 WebP Cloud 代理链接访问到我们的图片了,接下来就是为图片添加版权水印。

webp_watermark_feature

同样是查阅了 WebP Cloud 的文档,发现它在「Visual Effects」模块中提供了「Watermark」功能,可以为图片添加自定义的水印,使用 Fabric.js 库实现,提供了可视化编辑的一些选项,还写了一篇有意思的博客 – 「使用 Fabric.js 实现实时水印预览」。

watermark_list_webp

进入 WebP 控制台,选择左侧「Visual Effects」,并点击右上角「Create Watermark」,就可以进行一些自定义水印样式配置了。

pseudoyu_copyright

这是我的配置,即在图片的底部中间添加一个浅灰色的 @pseudoyu 字样。

webp_purge_all_cache

需要注意的是,WebP Cloud 会为用户缓存图片数据,因此若想要之前上传的图片也应用水印或更新了新的水印则需要在代理配置中点选「Purge All Cache」来清理缓存。

apply_watermark_webp

编辑完水印后,进入代理的详细配置页面,下拉到「Watermark Setting」模块,选取刚创建的水印,点击右上角「Save」即可。

效果就不单独展示了,本文所有配图都通过这种方式添加了水印。

总结

webp_thoughts

使用 WebP Cloud 才第三天,最开始一直以为只是一个类 CDN 图片加速访问工具,经过折腾后发现了很多有意思的地方,并且为个人免费用户提供的 Free Quota 足够到大家拥有更好的图片体验,也就是他们所坚持的「做正确的事」。

团队更多是做一些技术沉淀和实践,写了许多博客 – 「WebP Cloud Services Blog」,闲时读读也能感受到他们的热情,最近因为「周报 #63 - 不愉快的订花经历、商家和消费者与日渐 AI 化的人」这一篇中的经历而在思考「劣币驱逐良币」这一问题,我觉得坚持做正确的事不向商业做过多妥协的团队理应被更多人看到,理应过得更好,我人微言轻,仅以这些教程来让更多的人了解到他们。