网宝
新闻中心 / / 正文

跨境独立站如何防止被薅羊毛?服务器层面的反爬虫与安全防护策略

2026-04-02 17:08
技术部
← 返回

 

前言

跨境电商独立站做大之后,几乎都会遇到这样的问题:

  • 竞争对手用爬虫每天抓取你的商品价格和库存,实时跟价
  • 促销活动刚上线,几分钟内优惠券被机器人批量领完,真实用户一张都抢不到
  • 大量虚假账号注册,刷单、刷评价、薅新人礼包
  • 搜索功能被频繁调用,服务器负载飙升,正常用户访问变慢

这些问题不处理,轻则损失促销预算,重则影响正常用户体验,甚至被服务器打垮。

很多站长的第一反应是"装一个防爬插件",但这只是最浅层的防护。真正有效的安全防护需要从服务器层面系统建立,形成多层防御体系。

本文从网络层、服务器层、应用层三个维度,提供可直接落地的防护策略。


一、先了解你面临的威胁类型

威胁一:数据爬取(价格爬虫)

目标: 批量抓取你的商品标题、价格、库存、描述,用于竞品分析或自动跟价。

特征:

  • 短时间内大量访问商品页面
  • 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):

 
 
bash
# 安装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配置中添加请求频率限制,是最有效的反爬手段之一:

 
 
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

 
 
nginx
# 在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段的封锁列表:

 
 
nginx
# 创建封锁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
# 隐藏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验证。


注册环节防薅羊毛

① 邮箱验证

要求新注册用户验证邮箱,过滤临时邮箱注册:

 
 
php
// 检测临时邮箱域名
$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(免费开源版):

 
 
javascript
          
QQ客服 提交工单