CloudflareR2防刷请求方法分享


为啥要防止R2被刷?

Cloudflare的R2免费额度十分大方,流量无限,1000万次B类请求并带有CDN缓存

如此大方的免费额度,一切看着十分美好,但问题是:

  1. 404类请求是算入B类操作的
  2. 带URL参数的请求可以绕过缓存

所以这就导致R2的请求数可以很方便的绕过CDN刷R2,刷子们只需要不同请求不存在的文件或带上URL参数,那么每一下请求都会结结实实的打在R2上,1000万请求也扛不住一台2C2G的小鸡锲而不舍的刷上半天啊,为了避免我的账单爆表,所以有必要研究下怎么保护好我的钱包。

规避高昂成本操作

会计费的操作

我研究一下CloudflareR2那些操作会算入计费操作,经过研究,我得出以下结论:

1.A类操作创建存储桶写入对象操作,成本较高

会计入次数的操作 写入、复制、列出对象或分片对象 设置桶CORS 对象生命周期配置
不计次的操作 删除对象、中止分片上传 删除存储桶

2.B类操作是出口操作,成本较低

会计入次数的操作 常规的下载、取出文件 请求不存在的文件404页面 携带URL参数的请求
不计次的操作 被CDN缓存的文件 未到达R2的请求(废话)

3.存储空间,这个免费存储空间可不是说你最多只能使用10GB,是根据使用你的使用情况来进行计费的,是每月使用量

我打几个比方:

第一天操作 接下来的30天操作 月底结算
存入10GB整的文件 不做任何操作 10 GB * (30/30) =10GB/月,恭喜,免费!
存入299.99GB整文件 在接下来的29天内清空存储库 299.99GB * (1/30) ≈ 9.99GB/月,恭喜,免费!
存入301GB整文件 在接下来的29天内清空存储库 301GB * (1/30) ≈ 10.03GB/月,收取0.03GB费用

R2定价的计算公式就是取你每一天使用的存储的最大值(例如峰值299.99GB),然后计算在30天内的占比,最后计算每一天峰值使用的存储在30天内的占比总和,若没有超过10GB即免费。

(每月使用量)= (\frac{P_1 + P_2 + P_3 + … + P_{30}}{30})

如何规避?

所以,根据以上信息,我得出以下减少R2费用结论:

  1. 少写入、复制文件
  2. 多用CDN缓存公开的文件
  3. 将404、带URL参数的请求统统拦截
  4. 不要存放过大文件

开始规避

1.设置缓存

首先第一条是设置CDN,这个最简单有效还能提速,设置方法很简单,用Cache Rules规矩就好了

输入你的R2自定义公开域,然后设置匹配规则,下面选择符合缓存规则,然后再在下面根据你的需要设置下缓存TTL即可,注意要把忽略查询字符串打开,这样才会防止一堆携带URL参数的请求刷爆你的R2

防刷B类请求

想要防止一堆随机发送访问无效路径的请求刷我R2的B类请求,我便使用如下规则:

(http.host eq "earthcdn.teahush.link" and not (http.request.full_uri eq "https://earthcdn.teahush.link/latest.png" or http.request.full_uri eq "https://earthcdn.teahush.link/888.png"))

效果:

  • 白名单上的latest.png
  • 不在白名单上的666.png:

访问不存在路径的请求将会被拦截

如何使用?只需要修改earthcdn.teahush.link为你的R2公开访问域,然后(http.host eq "earthcdn.teahush.link" and not ()后的括号里添加你的文件路径即可,格式为earthcdn.teahush.link" and not (http.request.full_uri eq "https://你的R2访问域/文件名" or http.request.full_uri eq "https://你的R2访问域/路径/文件名"),每两个文件路径间用or连接,将编辑好的表达式输入图片上的方框内就好了

将你有存放文件的地址都添加进去,这样就会拦截掉一切请求无效路径的请求,防止404攻击。

总结

折腾半天就为了防止账单爆表,弄完后感觉还不如直接开CDN、速率限制,若网站火爆乖乖付款升级套餐🤣

写这类表达式还挺有意思的,很好玩,就是很容易写错了把整个站点搞下线,嗯,研究了半天表达式,我写了17个方案,感觉我已经成机器人思维了。My programming is complete. I am now… myself.



  目录