一开始我觉得,静态网站谈什么安全?没有后台、没有数据库、没有登录框,黑客来了也无从下手。认真查了一遍才发现:房子里确实没什么可偷的,但门牌、钥匙、信箱这些“房子外面的东西”,照样能被人拿去做坏事。
所以网站刚上线,我就给它做了一次体检。先只看不改,把情况摸清楚再说。

查完的结果是:没有能直接被利用的漏洞,这点静态网站确实占便宜。但有几扇门没锁好,都是后台点几下就能补上的。下面按要紧程度从上往下说。

第一道锁:账号
这一条比后面所有的都重要。代码在 GitHub,域名在 Cloudflare,文章在 Notion,谁拿到其中任何一个账号,谁就能改我的网站。三个账号我都开了两步验证,恢复码放进了密码管理器。
给自动化程序用的“钥匙”也只给了最小权限。负责部署的那把,只能动这一个网站,别的什么也碰不到。万一哪天它泄露了,也只丢这一间屋子。
第二道锁:域名和邮件
有个问题我之前完全没想到:域名就像我的门牌号,可我从没对外说过“这个门牌不寄信”。结果任何人都能伪造一个用我域名结尾的发件人去发邮件,收件人很难分辨。
解决办法是加两条 DNS 记录(SPF 和 DMARC),意思是“这个域名不发信,冒用的请对方直接拒收”。两行字的事。
顺手还开了 DNSSEC,相当于给门牌号盖个章:别人没法伪造 DNS 的回答,把访客引到假网站去。
第三道锁:传输
网站本来就强制 HTTPS,这次又开了 HSTS:浏览器来过一次之后,就会记住“这个站只走加密通道”,下次连明文的第一步都不走了。老旧的 TLS 1.0 和 1.1 也关掉了,现在的浏览器都用不着它们。
第四道锁:页面
给网站加了一张白名单(CSP),告诉浏览器:只执行我自己写的那两小段脚本,别的一律不认;也不许别的网站把我的页面嵌进去。就算哪天文章里混进了奇怪的代码,大部分也不会被执行。
这里有个小插曲:白名单刚加上,自动测试就报错了。原来文章里代码块的语法高亮是靠“内联颜色”实现的,白名单太严,代码块就会变成黑白的。最后只给颜色属性开了个小口子。幸好是测试先发现的,不是读者先发现的。
第五道锁:代码供应链
网站每次自动构建,要用到一些别人写的工具。以前写的是“用第 7 版”,作者要是被盗号、偷偷换了第 7 版的内容,我这边是察觉不到的。现在改成锁死到具体的某一次提交,同时打开了自动提醒:哪个依赖曝出漏洞,GitHub 会发邮件,还会顺手开好修复的改动,等我确认。
花了多少
钱:零。时间:一个晚上,大部分花在“先备份、再确认、再动手、再验证”上。每改一项都留了备份和记录,改错了也能退回去。
如果你也想自己建站

这张清单里的东西,大多是后台的一个开关或者一个下拉框。建议上线前就勾一遍,比出了事再补省心多了。