网站的安全性
网站的安全性
去年秋天,一个做独立博客的全性朋友半夜给我发消息:“数据库被拖了,三万多条用户记录,网站包括邮箱和哈希密码。全性”他的网站站不大,日活几百人,全性用的网站还是三年前某宝买的模板。攻击者没留勒索信,全性只是网站把数据挂在了某个暗网论坛上,标价0.3个比特币。全性他花了整整两周通知用户、网站重置密码、全性重装系统。网站最后跟我说了一句:“我以为小站没人盯。全性”
这大概是网站很多人的错觉——网站小,没价值,黑客看不上。但现实是,自动化扫描器每天爬取全网IP,寻找已知漏洞。你的站再小,只要有一个过时的插件、一个弱口令、一个没过滤的输入框,就可能变成肉鸡或者数据泄露的源头。安全不是“大站才需要操心的事”,它更像家里的门锁:你可以不装防盗门,但至少得把钥匙从锁孔里拔出来。
我见过最离谱的一个案例,是某地方企业官网。后台登录地址是 /admin/login.php,用户名 admin,密码 admin123。我试着输了一次,直接进去了。里面能改新闻、传文件、甚至执行SQL查询。负责人后来解释:“方便记忆,反正没人知道这个网址。”可搜索引擎早就收录了,robots.txt 里还大大方方写着 Disallow: /admin/,等于给攻击者画了箭头。
Allow from all
<Directory /var/www/html/uploads>
Options Indexes FollowSymLinks
Require all granted
</Directory>
上传目录开了目录浏览,里面还躺着 .php 文件。攻击者传一个 webshell,剩下的就是提权、内网漫游。这些不是高级漏洞,全是基础配置失误。但恰恰因为基础,很多人觉得“不至于”。
另一个容易被忽略的点是第三方依赖。前端引个 jQuery,后端用个 Log4j,或者 composer 里某个包三年没更新。你写业务代码时很小心,可供应链上的洞你根本不知道。Log4Shell 爆发那天,我认识的一个运维凌晨三点还在扫全网服务器,就为了找哪个项目用了受影响版本。他跟我说:“我自己的代码没问题,但我控制不了别人写的库。”
那怎么办?说几个我实际在用的笨办法。
第一,别自己造加密轮子。密码哈希用 bcrypt 或者 argon2,别用 md5 加盐——现在显卡跑 md5 跟嗑瓜子一样快。第二,所有用户输入都当成恶意数据。SQL 用参数化查询,HTML 输出用转义,文件上传白名单校验扩展名和 MIME,别信前端 JavaScript 验证。第三,最小权限。数据库账号别用 root,Web 目录别给写权限,除非上传目录。第四,日志和监控。我自己的小站装了 fail2ban,SSH 尝试五次失败就封 IP,虽然简单,但能挡掉九成脚本小子。
还有一点很现实:备份。不是那种放在同服务器 /backup 目录的备份。是异地、离线、定期验证可恢复的备份。我那个被拖库的朋友,如果有干净备份,至少不用从零开始。他后来买了个二手硬盘,每周手动 rsync 一次,放在家里抽屉里。听起来很土,但管用。
最后说个观察。很多网站出事,不是因为技术多差,而是因为“没人觉得会出事”。安全是一种习惯,不是一次性的配置。你今天打了个补丁,明天可能又装了个有漏洞的插件。保持怀疑,保持更新,保持最小化。别等数据挂在暗网上才想起改密码。
我自己的博客最近一次安全扫描,报告里还有两个中危漏洞——一个过期的 TLS 配置,一个缺少 CSP 头。你看,连写这篇文章的人都没法做到满分。但至少我知道它们存在,并且下周会去修。这大概就是安全最真实的样子:永远在修,永远不完美,但比什么都不做强。
```