You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5.2公共站点遭Bot攻击,寻求防钻取的非登录防护方案

针对Rails 5.2站点Bot攻击的解决方案

以下是几个无需依赖Recaptcha的可行方案,结合你的Rails环境和Cloudflare配置实现精准拦截Bot、放行人类用户:

1. Rails端会话令牌验证

给分类钻取链接绑定当前用户会话的唯一令牌,Bot无法维持有效会话,自然无法通过验证:

  • 生成钻取链接时,给每个会话生成随机令牌并附带在请求参数中
  • 在SearchResultsController里验证令牌与当前session的一致性,不匹配则直接返回403

示例代码:

# 视图中生成钻取链接的辅助方法
def drill_down_link(category)
  session[:search_token] ||= SecureRandom.hex(16)
  search_results_path(category_id: category.id, token: session[:search_token])
end

# SearchResultsController的前置验证
before_action :validate_search_token

private
def validate_search_token
  unless params[:token] == session[:search_token]
    head :forbidden
    return
  end
end

2. Cloudflare精准Bot拦截配置

放弃单纯的速率限制,改用Cloudflare的Bot管理功能:

  • 开启Bot Fight Mode:在Cloudflare控制台「安全 > Bots」中启用,通过行为分析自动区分恶意Bot和人类,拦截异常请求
  • 创建自定义防火墙规则:
    • 拦截User-Agent包含bot/spider/crawler且不属于Cloudflare标记的「友好Bot」的请求访问/searchresults
    • 拦截1分钟内请求/searchresults超过10次的IP(可根据正常用户行为调整阈值)
  • 启用Managed Ruleset:开启「Bot Management」规则集,利用Cloudflare的Bot数据库精准拦截已知恶意Bot

3. JS触发式钻取链接

把静态钻取链接改成JS触发的按钮,Bot通常不会执行JavaScript,无法发起有效请求:

  • 分类页的钻取按钮通过JS生成跳转链接,而非直接渲染a标签
  • 给禁用JS的人类用户留备用提示(比如引导启用JS或提供联系通道)

示例代码:

<button class="drill-btn" data-category="categoryA">查看CategoryA资源</button>

<script>
document.querySelectorAll('.drill-btn').forEach(btn => {
  btn.addEventListener('click', () => {
    const category = btn.dataset.category;
    window.location.href = `/searchresults?category=${category}`;
  });
});
</script>

<noscript>
  <p>请启用JavaScript以使用分类钻取功能,或联系我们获取资源帮助</p>
</noscript>

4. 缓存优化降低服务器负载

即使有Bot请求,通过缓存减少后端压力:

  • Rails端页面缓存:对/searchresults的查询结果做缓存,相同参数的请求直接返回缓存内容,避免重复查询数据库
    示例代码:
    def index
      @results = Resource.where(filter_params)
      expires_in 1.hour, public: true
      render cache: { key: "search_#{filter_params.to_query}", expires_in: 1.hour }
    end
    
  • Cloudflare页面规则缓存:给/searchresults路径设置缓存规则,让Cloudflare直接返回缓存页面,不回源到你的服务器

5. 自动IP拉黑(结合Rails+Cloudflare API)

用代码自动识别高频请求IP,调用Cloudflare API拉黑,替代手动操作:

  • 用Redis记录每个IP的/searchresults请求频率,超过阈值则调用Cloudflare API添加到黑名单
  • 可使用cloudflare-ruby gem简化API调用

内容的提问来源于stack exchange,提问作者mrdinghy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 20:51:32