IP访问限频:从单IP请求速率看滑窗计数算法
腾讯云CDN的IP访问限频功能用于限制单个客户端IP在单位时间内的请求次数。配置项包含“阈值”和“检测周期”,例如设置为3000次/分钟,表示某个IP在一分钟内请求超过3000次时,后续请求会被直接返回403状态码,或者跳转到指定页面。从原理上看,CDN边缘节点会基于内存计数器实现滑窗统计:每个IP对应一个请求计数队列,在时间窗口内维护访问次数。
滑窗算法并不简单地按整分钟重置计数器,而是采用滚动窗口避免边界突发。例如在15秒时窗口统计前60秒的请求总量,这样即便攻击者刻意在下个整分钟起点瞬间发起大量请求,也会被上一分钟尾部数据拉高总量从而触发限频。腾讯云CDN的滑窗粒度一般为秒级,实际效果是持续高频访问的IP会很快被限制,而正常浏览的偶发请求不会受影响。
配置限频值时需要结合实际业务。对于静态资源站点,单个页面可能产生数十个请求(CSS、JS、图片等),一个正常用户在首次冷加载时可能瞬间产生50-80次请求。如果用10次/秒的阈值就会立即误杀。建议通过日志分析出单用户平均请求数,再乘以一个安全系数(例如2~3倍)作为起始阈值。对于API类加速,阈值可以收紧到业务要求的正常QPS上限。同时可以使用IP黑白名单配合,对已知的爬虫IP直接封禁,降低限频压力。
# 通过腾讯云CLI配置IP访问限频示例(仅示意参数) tccli cdn UpdateDomainConfig --Domain example.ipipp.com --IpFreqLimit.Switch on --IpFreqLimit.Qps 300 --IpFreqLimit.WindowSeconds 60
防盗链Key有效期:签名参数如何绑定时间戳
腾讯云CDN的防盗链功能支持TypeA、TypeB、TypeC三种签名方式,其中TypeB和TypeC通过Key与过期时间戳组合生成md5或sha256签名,实现URL的时效性控制。基本流程是:源站生成签名时填入一个未来的时间戳(如当前时间+300秒),CDN节点收到请求后解析该时间戳并与当前时间比较,如果已过期则拒绝访问。
签名计算通常采用如下格式:将“过期时间戳-随机数-用户ID”与预先配置的鉴权Key拼接后取md5。例如:md5(timestamp-rand-uid-Key)。关键参数就是Key和过期时长。Key泄露意味着攻击者可以自行构造合法签名,因此保管好Key是前提。过期时长的设置需要权衡:过期时间太短,可能导致用户页面停留一段时间后点击链接失效,或者网络波动造成请求到达CDN时刚好超时;过期时间太长,则签名的安全窗口变大,被截获后可以持续滥用。
实际场景中,对于视频点播类业务,可以设置5-10分钟的有效期,配合播放器自动刷新签名。对于下载类链接,如果是一次性下载,过期时间可以设的比较短(如60秒);如果允许重复下载,可以拉长到30分钟。另外,CDN节点的时间与标准时间可能存在偏差,腾讯云节点定期同步NTP,但为防止极端情况,可以在签名校验时给3-5秒的时钟偏移容忍度。
import time
import hashlib
# 防盗链TypeB签名生成示例
key = "your_auth_key"
expire = int(time.time()) + 300 # 5分钟有效期
rand = "1234567890"
uid = "0"
raw_str = f"{expire}-{rand}-{uid}-{key}"
sign = hashlib.md5(raw_str.encode()).hexdigest()
auth_url = f"/video.mp4?sign={sign}&t={expire}&r={rand}&u={uid}"
print(auth_url)
双管齐下:限频与防盗链的组合策略及常见踩坑
IP访问限频和防盗链经常被同时启用,但两者作用维度不同:限频侧重请求频率,防盗链侧重URL合法性。如果仅开限频,盗链者可以通过大量不同IP发起请求,每个IP都在阈值以下,总流量仍然很高。如果仅开防盗链,合法签名一旦泄露出去,攻击者可以用同一个签名高并发请求,没有频率限制同样会造成带宽突增。因此组合策略才是最优解。
一个典型的场景是:对于已登录用户的音频资源,源站每次下发音视频URL时生成带签名的链接,有效期设为播放时长+30秒缓冲;同时在CDN配置IP单秒请求不超过10次。这样即使签名被截获,攻击者单IP的高频请求也会被限频打断,大规模代理请求则因代理IP分散而难以集中突破。需要注意的是,防盗链Key过期后用户可能正在播放中,前端需要实现无感刷新令牌的机制,例如在播放错误事件里重新向源站请求新URL。
常见踩坑点包括:过期时间戳使用客户端时间而非标准时间,导致CDN节点校验失败;防盗链Key配置后未生效因为CDN域名配置需要发布部署到边缘节点,有3-5分钟生效延迟;限频统计维度误选为“单节点”导致同一个IP漫游到不同节点时统计被重置,攻击者可以利用这一点切换节点绕过——腾讯云CDN支持选择“全网”或“单节点”统计,建议选“全网”。另外,限频拒绝后的行为可以配置为返回403或者重定向,重定向可能被攻击者用来转向付费页面,需要谨慎使用。
# 源站动态生成防盗链URL的Nginx配置段伪代码
location /api/get_media {
set $expire `date -d '+5 minutes' +%s`;
set $rand random_string 10;
set $sign `echo -n "${expire}-${rand}-0-${key}" | md5sum | cut -d' ' -f1`;
return 302 /media$uri?sign=$sign&t=$expire&r=$rand&u=0;
}
最后,在控制台配置完成后,务必通过curl或浏览器模拟攻击场景进行验证:使用ab工具对限频路径加压,观察是否出现403;将签名中的t参数改为过去的时间戳,确认防盗链生效。只有经过实际压测,才能确保参数生效且不会误伤正常用户,也才能让CDN的访问控制真正成为网站可靠的安全屏障。