网站安全加固方案
做网站的人最容易踩的坑,是把安全当成“上线前装个 WAF”就算完。但 WAF 只是最外面的一层,真正的安全问题往往藏在配置、权限和代码习惯里。下面这套方案从提示词、系统配置到响应流程,给你一条能直接落地的加固路径。
AI 提示词模板
拿不准该从哪里入手时,可以让 AI 先给一份方案,再逐条核对:
请帮我制定网站安全加固方案。
- 网站类型:[企业展示/电商/博客/应用]
- 技术栈:[PHP/Node.js/Python] | OS:[Ubuntu/CentOS]
输出:SSH/防火墙配置、SSL/TLS 最佳实践、WAF 配置、自动备份策略、XSS/CSRF/SQL注入防护。
服务器初始化安全清单
新服务器第一次开机,先过一遍这张清单:
- 禁用 root 的 SSH 登录
- 修改默认 SSH 端口
- 启用 UFW,只放行 80、443、22
- 安装 fail2ban
- 开启自动 安全更新
Nginx 安全头部
隐藏版本号、限制请求体大小,是最低成本的加固:
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
client_max_body_size 50M;
更完整的一套响应头还包括来源策略和内容安全策略:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https:;" always;
自动备份脚本
备份是安全兜底的最后一环。下面这个脚本可以放进 cron 里每天执行:
#!/bin/bash
WEBSITE_DIR=${1:-/var/www/html}
BACKUP_DIR=${2:-/backups/web}
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
tar -czf "${BACKUP_DIR}/backup_${DATE}.tar.gz" "$WEBSITE_DIR"
echo "备份完成"
注意两点:备份要放到公网访问不到的目录,并且异地再存一份,防止服务器被入侵后连备份一起被删。
安全是设计出来的,不是装出来的
很多人以为网站安全等于“装个 WAF”。但安全没办法事后贴上去,它必须渗透到每个设计决策里。
最朴素的两条原则:永远不信任用户输入,永远使用最小权限。
三层防线
第一层:网络边界。大多数人从这里起步,能挡掉约 80% 的自动化攻击:
- 只开放必要端口(80、443、SSH)
- 用 SSH 密钥而不是密码
- 装 fail2ban 防暴力破解
- 启用 UFW 或 iptables
第二层:应用层。真正的伤害发生在这里:
- SQL 注入:用参数化查询或 ORM,永远不要拼接 SQL 字符串;
- XSS:所有渲染到 HTML 的输出都要转义。前端框架一般会处理,但要小心直接操作 DOM 的地方;
- CSRF:每个表单生成唯一 token,提交时校验;
- 文件上传:上传目录禁用脚本执行,限制文件类型和大小,必要时用独立域名或云存储。
第三层:数据层:
- 数据库用强随机密码,一个服务一个密码
- 备份先加密再存放
- 备份绝不放公网可访问的目录
HTTPS 配置
server {
listen 443 ssl http2;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:...;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
}
配置完去 ssllabs.com 测一遍,目标拿到 A 或更高评分。
事件响应:出事之后怎么办
做了再多防护,也可能出事。关键看你怎么响应:
- 发现:监控或用户反馈发现异常
- 隔离:把受影响的服务从集群中摘掉
- 分析:翻日志,确定入侵路径和数据影响范围
- 修复:打补丁,重置所有受影响凭据
- 恢复:从干净的 备份恢复
- 复盘:写事后报告,更新安全策略
每半年做一次桌面演练——花两小时把每个步骤过一遍,能发现很多你以为没有的漏洞。
一个实操场景:上线前 15 分钟
假设你刚把新站部署到一台腾讯云服务器,域名解析也生效了。上线前 15 分钟,值得做三件快事:跑一次 nmap -p- 你的IP 看有没有意外的开放端口;检查数据库默认账号和弱口令;给后台登录加一个二次验证。很多“上线三天就被挂马”的案例,根因就是这三个里漏了一个。
常见问题
免费证书和付费证书差别大吗? 对绝大多数网站来说,Let's Encrypt 的免费证书已经足够,关键是把自动续期配置好。付费证书多出来的通常是更长的有效期和商业保障,并不影响加密强度。
被 CC 攻击了怎么办? 先确认攻击流量特征:如果是单一 IP 反复刷接口,直接封 IP 加限流;如果是分布式打带宽,单台服务器很难扛住,建议启用高防或 CDN 清洗。平时把日志和监控做好,出问题时才能快速判断攻击类型。
WAF 能替代代码层面的防护吗? 不能。WAF 拦截的是已知的、特征明显的攻击;代码里的注入点、越权、敏感信息泄露,WAF 往往看不出来。两者是叠加关系,不是二选一。
密码策略和二次验证,先做哪个? 建议先做两件免费的事:改掉默认密码、给管理员账号开启二次验证。这两件事成本最低,但能挡住绝大多数撞库和弱口令攻击。
今天就做一件事
安全不是买来的产品,是一种习惯。从一件小事开始:登录你的服务器,查一下有没有没改过的默认密码,或者还开着的测试端口。
参考:OWASP 十大 Web 应用安全风险 https://owasp.org/www-project-top-ten/ ,Mozilla 安全响应头指南 https://infosec.mozilla.org/guidelines/web_security ,Let's Encrypt 证书文档 https://letsencrypt.org/docs/