前言
跨境电商独立站做大之后,几乎都会遇到这样的问题:
- 竞争对手用爬虫每天抓取你的商品价格和库存,实时跟价
- 促销活动刚上线,几分钟内优惠券被机器人批量领完,真实用户一张都抢不到
- 大量虚假账号注册,刷单、刷评价、薅新人礼包
- 搜索功能被频繁调用,服务器负载飙升,正常用户访问变慢
这些问题不处理,轻则损失促销预算,重则影响正常用户体验,甚至被服务器打垮。
很多站长的第一反应是"装一个防爬插件",但这只是最浅层的防护。真正有效的安全防护需要从服务器层面系统建立,形成多层防御体系。
本文从网络层、服务器层、应用层三个维度,提供可直接落地的防护策略。
一、先了解你面临的威胁类型
威胁一:数据爬取(价格爬虫)
目标: 批量抓取你的商品标题、价格、库存、描述,用于竞品分析或自动跟价。
特征:
- 短时间内大量访问商品页面
- User-Agent通常是标准爬虫标识(如Python-urllib、Scrapy等)
- 访问规律性强,按照固定间隔、固定路径爬取
- 不执行JavaScript(无法通过JS渲染的内容)
危害: 竞争情报泄露,价格策略被实时跟踪,促销效果被削弱
威胁二:优惠券/活动薅羊毛
目标: 批量注册账号、批量领取优惠券、批量参与抽奖活动。
特征:
- 短时间内大量新账号注册
- 注册信息使用临时邮箱(如mailnator.com结尾的邮箱)
- 同一IP或同一IP段的多个账号
- 行为路径异常简单(直接到达领券页面,不浏览其他内容)
危害: 促销预算被无效消耗,真实用户无法享受优惠,活动ROI崩溃
威胁三:账号暴力破解
目标: 通过大量尝试用户名+密码组合,破解真实用户账号,盗取账号内的余额、积分、购物记录。
特征:
- 登录接口被高频请求
- 同一IP尝试大量不同的账号密码组合
- 使用已泄露的账号密码字典(撞库攻击)
危害: 用户账号被盗,引发客诉和退款纠纷,损害品牌信誉
威胁四:内容盗取
目标: 批量抓取你的商品图片、描述文案、用户评价,用于建立竞品站点。
危害: 原创内容价值流失,SEO权重可能因内容重复而受损
二、第一层防护:网络层(CDN和防火墙)
接入Cloudflare,第一道防线
Cloudflare是目前最有效的网络层防护工具,免费版即可提供基础防爬能力。
开启Bot Fight Mode:
在Cloudflare控制台 → Security → Bots → 开启"Bot Fight Mode"。
这个功能会自动识别并挑战已知的爬虫程序,让它们无法直接访问你的网站内容。经过Cloudflare认证的合法搜索引擎爬虫(如Googlebot)不受影响。
配置防火墙规则(免费版支持5条规则):
规则一:封锁明显的爬虫User-Agent
(http.user_agent contains "python-requests") or
(http.user_agent contains "scrapy") or
(http.user_agent contains "curl") or
(http.user_agent contains "wget") or
(http.user_agent eq "")
动作:Block(直接封锁)
规则二:限制API接口访问频率
(http.request.uri.path contains "/api/") and
(cf.threat_score gt 10)
动作:Challenge(JS挑战)
规则三:保护登录接口
(http.request.uri.path eq "/login") and
(cf.threat_score gt 5)
动作:Challenge
规则四:保护优惠券领取接口
(http.request.uri.path contains "/coupon") and
(not cf.client.bot)
动作:Managed Challenge(托管挑战)
服务器防火墙层面的IP封锁
对于绕过CDN直接攻击服务器IP的情况,在服务器防火墙层面增加规则:
自动封锁高频访问IP(CentOS/使用iptables):
# 安装fail2ban(自动封锁暴力破解IP)
yum install fail2ban -y
# 配置fail2ban监控Nginx日志
cat > /etc/fail2ban/jail.local << 'EOF'
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
action = iptables-multiport[name=ReqLimit, port="http,https"]
logpath = /www/wwwlogs/*.log
findtime = 60
maxretry = 100
bantime = 3600
EOF
# 创建过滤规则
cat > /etc/fail2ban/filter.d/nginx-req-limit.conf << 'EOF'
[Definition]
failregex = ^<HOST>.*"(GET|POST).*
ignoreregex =
EOF
systemctl start fail2ban
systemctl enable fail2ban
这个配置会自动封锁60秒内访问超过100次的IP,封锁时间1小时。
三、第二层防护:服务器层(Nginx配置)
限制请求频率
在Nginx配置中添加请求频率限制,是最有效的反爬手段之一:
# 在http块中定义限速区域
http {
# 按IP限速(每个IP每秒最多10个请求)
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
# 按IP限制并发连接数
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
# 应用全局限速
limit_req zone=perip burst=20 nodelay;
limit_conn addr 20;
# 对搜索接口单独限速(更严格)
location /search {
limit_req zone=perip burst=5 nodelay;
}
# 对API接口单独限速
location /api/ {
limit_req zone=perip burst=10 nodelay;
# 超出限速返回429而不是503
limit_req_status 429;
}
}
}
封锁可疑User-Agent
# 在server块中添加
map $http_user_agent $bad_bot {
default 0;
~*(scrapy|python-requests|python-urllib|curl|wget|libwww|httpunit|Go-http-client) 1;
~*(AhrefsBot|MJ12bot|DotBot|BLEXBot|SemrushBot) 1;
"" 1; # 空User-Agent
}
server {
if ($bad_bot) {
return 403;
}
}
封锁已知恶意IP段
可以维护一个已知恶意IP段的封锁列表:
# 创建封锁IP列表文件
geo $blocked_ip {
default 0;
# 已知的恶意扫描IP段
45.148.10.0/24 1;
167.94.138.0/24 1;
# 可持续添加
}
server {
if ($blocked_ip) {
return 403;
}
}
隐藏服务器敏感信息
# 隐藏Nginx版本号
server_tokens off;
# 隐藏PHP版本
fastcgi_hide_header X-Powered-By;
proxy_hide_header X-Powered-By;
# 添加安全响应头
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Referrer-Policy "strict-origin-when-cross-origin";
四、第三层防护:应用层(代码和业务逻辑)
关键接口添加验证码
对于高风险操作(注册、登录、领券、下单),添加验证码是最直接有效的防机器人手段。
推荐方案:
- Google reCAPTCHA v3:无感验证,根据用户行为打分,低分用户触发验证挑战,不影响正常用户体验
- Cloudflare Turnstile:免费,与reCAPTCHA类似,隐私保护更好
- 阿里云验证码:国内用户友好,滑动验证,适合国内团队维护
WordPress / WooCommerce 添加登录验证码(插件方式):
安装插件"WP Cerber Security"或"Loginizer",一键为登录页面添加reCAPTCHA验证。
注册环节防薅羊毛
① 邮箱验证
要求新注册用户验证邮箱,过滤临时邮箱注册:
// 检测临时邮箱域名
$temp_email_domains = ['mailnator.com', 'guerrillamail.com', 'tempmail.com', '10minutemail.com', 'throwam.com'];
$email_domain = substr(strrchr($email, "@"), 1);
if (in_array($email_domain, $temp_email_domains)) {
return new WP_Error('invalid_email', '请使用正式邮箱注册');
}
② 手机号验证
在优惠券领取、新人礼包等高价值活动中,要求绑定手机号并验证,一个手机号只能参与一次。
③ 账号冷静期
新注册账号24小时内不能领取优惠券或参与特定活动,机器人注册账号薅羊毛的成本大幅提升。
优惠券防薅羊毛
① 单账号限领数量
每个账号最多领取N张,超出拒绝请求。
② 单IP限领数量
同一IP最多领取N张,覆盖同一机器多账号的情况。
③ 设备指纹
通过浏览器指纹(设备类型、屏幕分辨率、字体列表等)识别同一设备的多个账号,限制单设备领券数量。
推荐使用FingerprintJS(免费开源版):