上个月一个做外贸独立站的客户找我,说网站首页被换成了"Hacked by xxx",WordPress后台也登不进去了。我问了他三个问题:最近一次备份是什么时候?服务器开了fail2ban没有?wp-admin目录加了IP白名单吗?三个问题的答案都是"没有"。
最后花了整整两天才把网站恢复——不是被黑得有多严重,是没有任何备份,只能从三个月前的数据库dump重新搭,丢了130多篇产品和文章数据。
网站防黑这件事,90%的站长想得太复杂了。总觉得要请安全专家、买企业级WAF、搞渗透测试。但其实被黑的大部分网站,不是因为遭遇了什么高级APT攻击,而是八个基础设置里有三四个没配。这八个设置,大部分是免费的,每个操作不超过20分钟,加起来两三个小时就能把90%的常见攻击挡在外面。
八个防黑设置一览
| 优先级 | 设置项 | 防什么 | 耗时 | 成本 |
|---|---|---|---|---|
| 1 | 自动备份 + 异地存储 | 任何攻击的兜底方案 | 20分钟 | 免费 |
| 2 | SSH密钥登录 + 改端口 | 暴力破解、密码撞库 | 15分钟 | 免费 |
| 3 | fail2ban 自动封禁 | 持续暴力破解、扫描探测 | 15分钟 | 免费 |
| 4 | 文件权限最小化 | Webshell写入、源码泄露 | 10分钟 | 免费 |
| 5 | 登录保护 + 双因素认证 | 后台撞库、弱口令 | 10分钟 | 免费 |
| 6 | Cloudflare CDN + WAF | DDoS、SQL注入、XSS、爬虫 | 30分钟 | 免费 |
| 7 | CMS/插件/主题 自动更新 | 已知漏洞利用 | 10分钟 | 免费 |
| 8 | 安全插件 / WAF应用层 | 应用层漏洞、恶意扫描 | 20分钟 | 免费~$300/年 |
红=兜底,橙=服务器层,绿=应用层,蓝=可选增强
下面按优先级顺序,把每个设置怎么做、为什么这样做、配完怎么验证,逐一说清楚。
一、自动备份:所有安全措施的最后一道防线
这句话不好听,但事实就是如此:再完善的防护也可能被突破,但如果你有备份,被黑了最多损失几小时的数据;没有备份,可能损失几年的心血。

备份要满足三个条件才算有效备份:
· 自动化——不能靠人记着去备份,必须设置定时任务自动执行
· 异地——备份文件不能和网站放在同一台服务器上,服务器挂了备份也没了等于白做
· 可恢复——每隔一段时间要实际演练一次恢复流程,确认备份文件是完整的、能成功恢复的
具体方案分两种情况:
WordPress / CMS 网站
用 UpdraftPlus(免费版就够用),设置每天自动备份数据库+文件,备份目的地选Google Drive或OneDrive(免费15GB空间,够大多数站点用)。配好之后它会自动跑,出问题了发邮件通知你。
如果预算允许,BlogVault($89/年起)支持增量备份+一键恢复+自动异地存储到AWS,比UpdraftPlus多了实时备份能力,适合电商或数据更新频繁的站。
验证方法:去备份目的地看一眼,最近一次备份文件的时间是不是今天的。再在测试环境做一次完整恢复,确认数据库和文件都回来了。
自定义开发 / 非CMS网站
数据库备份:
# crontab 每天凌晨3点备份数据库并上传到远程存储0 3 * * * mysqldump -u user -p'password' dbname | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz && rclone copy /backup/ remote:bucket-name/
文件备份:
# 每天凌晨4点打包网站文件并上传0 4 * * * tar -czf /backup/www_$(date +\%Y\%m\%d).tar.gz /var/www/html && rclone copy /backup/ remote:bucket-name/
rclone 支持传到Google Drive、OneDrive、S3、Backblaze B2等几十种存储,免费开源。Backblaze B2 10GB以内免费,超出后$0.006/GB/月,比云服务器自带的快照便宜得多。
二、SSH密钥登录 + 改默认端口
一台暴露在公网的Linux服务器,平均每天会被扫描数千次SSH 22端口。攻击者用密码字典撞,弱密码可能在几小时内就被撞开。
两件事做了,SSH暴力破解的问题基本解决:
禁用密码登录,只用密钥
# /etc/ssh/sshd_configPasswordAuthentication noPubkeyAuthentication yesPermitRootLogin prohibit-password
改完执行 systemctl restart sshd。注意:先在本地生成密钥对,把公钥放到服务器上,确认密钥能登录之后再关密码,否则你自己也进不去了。
改掉22默认端口
# /etc/ssh/sshd_configPort 22987 # 选一个1024-65535之间的
改完防火墙放行新端口、重启sshd。改了之后扫描流量直接降99%以上——因为自动化扫描只撞22端口。
验证方法:grep "Failed password" /var/log/auth.log | wc -l 看看改之前和改之后失败登录尝试的变化。改之前可能是几千条,改完端口后基本清零。
三、fail2ban:自动封禁恶意IP
改了SSH端口还不够,攻击者如果扫到了你的新端口还是会继续撞。fail2ban的作用是:同一个IP在短时间内多次登录失败,自动把它加入防火墙黑名单,封禁一段时间。
安装配置很简单:
# Ubuntu/Debianapt install fail2ban -y# 创建本地配置覆盖默认值cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
关键配置项(在jail.local里改):
| 参数 | 建议值 | 含义 |
|---|---|---|
bantime | 3600(1小时) | 封禁时长,生产环境设24小时也行 |
findtime | 600(10分钟) | 在这个时间窗口内累计失败次数 |
maxretry | 3 | 失败3次就封 |
fail2ban不止保护SSH,还能保护Nginx、Apache、WordPress登录页:
# jail.local 增加 WordPress 登录保护[wordpress]enabled = truefilter = wordpresslogpath = /var/log/nginx/access.logmaxretry = 5bantime = 3600
验证方法:fail2ban-client status sshd 查看当前封禁了多少IP。一个新上线的服务器,24小时内封禁几十个IP很正常。
四、文件权限最小化
这是最容易被忽略的一条。很多网站被黑后,攻击者之所以能写入Webshell文件,根本原因是网站目录的权限太松了——PHP进程可以随便在任意目录创建文件。
核心原则就一条:只有需要写入的目录才给写权限,其他目录全部只读。

WordPress / PHP网站标准权限设置
| 目录/文件 | 权限 | 所有者 | 原因 |
|---|---|---|---|
| 所有.php文件 | 644 | root:www-data | PHP文件只需可读 |
| 所有目录 | 755 | root:www-data | 目录需可执行才能进入 |
| wp-content/uploads/ | 755 | www-data | 唯一需要PHP进程写入的目录 |
| wp-config.php | 400 | root:root | 数据库密码文件,最严格的只读 |
一键设置脚本:
# 所有文件设为644,目录设为755find /var/www/html -type f -exec chmod 644 {} \;find /var/www/html -type d -exec chmod 755 {} \;# wp-config.php 收紧到400chmod 400 /var/www/html/wp-config.php# uploads 目录给 www-data 写权限chown -R www-data:www-data /var/www/html/wp-content/uploads# 禁止uploads目录执行PHP(防Webshell)# 在Nginx配置中加:location ~* /wp-content/uploads/.*\.php$ {deny all;}验证方法:find /var/www/html -type f -perm /o+w | head 检查有没有其他用户可写的文件。输出为空说明没问题。
五、登录保护:后台是攻击者的第一目标
不管你是WordPress、自定义后台还是其他CMS,登录入口是攻击者花最多精力撞的地方。Sucuri的报告显示,暴力破解登录占了WordPress被黑案例的16%以上。
WordPress 登录保护四件套
- 改默认登录URL:把 /wp-admin 和 /wp-login.php 改成只有你知道的路径。用 WPS Hide Login 插件或 Cloudflare Zero Trust。
- 限制登录尝试次数:Wordfence 或 Limit Login Attempts Reloaded 插件,同一IP 5次失败后锁定30分钟。
- 开启双因素认证(2FA):Wordfence免费版自带,或装 Google Authenticator 插件。这是防止密码泄露后账号被接管的最有效手段。
- 删掉admin账号:如果默认管理员用户名是 admin 或 administrator,新建一个复杂用户名,把旧的删掉或降权。
自定义后台登录保护
- IP白名单:如果只有固定IP或固定地区的人需要登录后台,用Nginx或Cloudflare直接限制。
- HTTP Basic Auth 加一层:在Nginx里对后台路径加一层 .htpasswd 认证,攻击者连登录页面都看不到。
- 强密码策略:最少12位,包含大小写字母+数字+特殊字符。别用同一个密码在多个平台。
验证方法:用隐身窗口访问你的登录页,确认改了URL后默认路径返回404。再故意输错5次密码,确认被锁定了。
六、Cloudflare:零成本的网络层防护
如果你的网站还没套Cloudflare,这是今天就能做、做完立刻生效的防护升级。免费版已经包含了DDoS防护、SSL、基础WAF规则、Bot管理和IP封禁。
接入步骤:
- 注册Cloudflare → 添加站点 → 把域名的NS记录改成Cloudflare提供的两个地址
- SSL/TLS 设置选 "Full (strict)"——这确保Cloudflare到你服务器之间的流量也是加密的
- 在 Security → WAF 里开启以下免费规则:
- Cloudflare Managed Ruleset——拦截SQL注入、XSS、文件包含等OWASP Top 10攻击
- Bot Fight Mode——自动拦截已知恶意爬虫
- 在 Security → Settings 里设置:
- Security Level:Medium——对可疑访问显示JS验证页面
- Challenge Passage:30 minutes——验证通过后30分钟内不用重新验证
- 在 Rules 里创建自定义规则:
- 对 /wp-admin 路径:设置 Managed Challenge(对国内访客友好)或 Block(限制非你所在国家/地区的IP访问)
- 对 /xmlrpc.php:直接 Block(WordPress的XML-RPC是暴力破解重灾区,99%的站用不上)
Cloudflare免费版WAF每月有10000次免费规则请求,对中小网站完全够用。
验证方法:在Cloudflare的Security → Events里查看最近24小时拦截了哪些请求。如果WAF已经在干活了,会看到 blocked 事件。
七、CMS和插件自动更新
根据Wordfence的年度报告,被黑的WordPress网站中,超过55%是因为插件存在已知漏洞但没更新。WordPress核心、插件、主题的开发者在发现漏洞后会发布补丁,但如果你不更新,等于把门开着告诉全世界"来黑我"。
自动更新设置(WordPress为例):
# wp-config.php 里开启自动更新define('WP_AUTO_UPDATE_CORE', true); # 核心自动更新# 在 functions.php 或使用插件开启插件/主题自动更新add_filter('auto_update_plugin', '__return_true');add_filter('auto_update_theme', '__return_true');但自动更新也有风险:极少数情况下更新会导致兼容性问题。折中方案是:核心和主题开自动更新,插件手动更新但每周检查一次。Wordfence免费版会邮件通知你有插件需要更新。
删掉不用的插件和主题。每多一个不用的插件,就多一个潜在的攻击面。很多被黑的站,漏洞来源是一个装了三年没用过的"联系表单"插件。
八、安全插件 / 应用层WAF
前七项设置做完,大部分常见攻击已经挡住了。如果预算和精力允许,再加一层应用层WAF或安全插件,做深度防护。
WordPress安全插件三选一
| 插件 | 免费版核心功能 | 付费版起价 | 适合谁 |
|---|---|---|---|
| Wordfence | WAF + 恶意软件扫描 + 登录保护 + 2FA + 实时威胁情报(延迟30天) | $119/年 | 绝大多数WordPress站,免费版功能最全 |
| Solid Security(原iThemes) | 文件权限检查 + 暴力破解防护 + 安全加固向导 + 文件变更监控 | $99/年 | 不想研究复杂配置,喜欢"一键加固"的新手 |
| Sucuri Security | 安全审计 + 文件完整性监控 + 黑名单检测 + 安全加固提示 | $199/年 | 需要专业安全团队支持+被黑后清理服务的站 |
注意:不要同时装多个安全插件。它们会互相冲突——WAF规则重叠导致网站变慢或误拦截,恶意软件扫描互相触发告警。选一个就够了。
非WordPress网站的应用层WAF,推荐两个方向:
开源自建:ModSecurity + OWASP Core Rule Set
免费,规则覆盖全面,但需要一定的Nginx/Apache配置能力。规则集持续更新,能拦截90%以上的已知Web攻击模式。缺点是会有误报,需要花时间调优。
云WAF:阿里云/腾讯云/华为云WAF
按月付费,基础版约¥500-1500/月。优势是开箱即用、自动更新规则、有专业团队维护、支持等保合规。适合企业站和对可用性要求高的业务。
怎么确认这些设置都生效了
配完不等于安全了。至少要过这三关确认:
| 检查方法 | 工具 | 查什么 |
|---|---|---|
| SSL/TLS配置评分 | SSL Labs (ssllabs.com/ssltest) | 证书链、协议版本、加密套件,目标A+ |
| HTTP安全头 | SecurityHeaders.com | CSP、HSTS、X-Frame-Options等是否配置 |
| 漏洞扫描 | Mozilla Observatory | 综合安全评分,含CSP/CORS/Referrer等 |
| 恶意软件/黑名单 | Sucuri SiteCheck(免费) | 是否被列入黑名单、是否有已知恶意软件 |
| 备份恢复演练 | 手动操作 | 备份文件是否完整可用 |
这些检查全部免费,跑一遍不超过30分钟。至少每个月跑一次。
不同预算的防黑设置组合
| 预算 | 方案 | 能防住什么 |
|---|---|---|
| ¥0/月 | 备份(UpdraftPlus/rclone) + SSH密钥+fail2ban + 文件权限 + 2FA + Cloudflare免费版 + 自动更新 | 暴力破解、常见Web攻击、DDoS、数据丢失 |
| ¥50-200/月 | 以上 + Wordfence Premium(实时威胁情报) + BlogVault增量备份 | 零日漏洞实时防护、更精细的WAF规则、即时恢复 |
| ¥500-2000/月 | 以上 + 云WAF(阿里云/腾讯云) + Sucuri企业清理服务 + 专业安全审计 | 企业级防护、等保合规、专业应急响应 |
对绝大多数个人站长和中小企业的网站来说,零成本的方案已经能防住95%以上的常见攻击。付费方案的价值在于:把防不住的那5%也尽量补上,以及出事后有人能帮你处理。
最后说句不好听的:被黑这件事,大概率不是"会不会",而是"什么时候"。关键是你有没有备份能恢复,有没有监控能第一时间发现。一个每月花0元但每天自动备份的网站,比一个花了两千块买WAF但从不备份的网站,实际安全得多。
安全设置做完之后,建议每三个月跑一遍上面的检查清单。服务器在变、CMS在更新、新的漏洞在出现——安全不是一次性配置,是持续的习惯。
