防盗链这事儿,大部分人的认知还停留在“不让别人引用我的图片”上。但当你把业务迁移到云WAF后面,尤其是面对现在花样百出的盗刷、伪原创采集和接口滥用,传统的基于Web Server的防盗链配置已经彻底不够用了。云WAF的自定义防盗链功能,本质上是一套工作在应用层边缘的、基于逻辑运算的访问控制引擎。它不再简单地判断Referer头是否匹配,而是允许你像写代码一样,用逻辑表达式去编织一张精密的防御网。
从“匹配”进化到“运算”:自定义防盗链的核心逻辑传统的防盗链,无论是Nginx的valid_referers还是Apache的RewriteCond,本质上都是在做字符串匹配。黑名单、白名单、允许空Referer,逻辑是固化的。云WAF的自定义防盗链打破了这种僵化,它引入了“逻辑与”、“逻辑或”、“逻辑非”以及括号优先级,让你可以把HTTP请求中的多个字段组合成一个复杂的判决条件。
举个例子,你有一个视频网站,需求是这样的:对于MP4文件,只允许来自自己主站和移动APP的请求,且请求的User-Agent不能是空,同时请求频率超过阈值的要直接拦截。在传统架构下,你需要组合Web Server配置、Lua脚本或者专门的限流模块。而在云WAF里,这只是一条规则。你可以定义:
(请求URI后缀等于“.mp4”)且(Referer包含“yourdomain.com”或“your-app-scheme”)且(User-Agent不为空)且(访问频次小于阈值)。
这条规则的精髓在于,它将静态的防盗链(Referer检查)和动态的行为分析(User-Agent非空、频次控制)无缝融合在了一个判断语句里。这种“运算”能力,让防盗链从单维度的来源检查,升级为了多维度的请求可信度评估。
深入HTTP头:Referer之外的主战场只盯着Referer,就像只检查一个人的身份证而不看他的神态和行为。云WAF自定义防盗链的强大之处,在于你可以把HTTP请求的几乎所有标准头和自定义头都拉入战场。
User-Agent是第一个要严查的。大量盗链脚本、爬虫,要么用默认的库(如python-requests/2.x),要么直接留空。你可以设置规则:当请求图片、CSS、JS等静态资源时,User-Agent为空或包含“scrapy”、“curl”、“wget”等特征词的,直接标记为盗链并拦截。这能过滤掉一大半低水平的资源盗用。
Cookie和自定义Token是更高阶的玩法。对于登录用户才能访问的私有资源(如PDF报告、付费下载文件),你可以在用户登录后,由源站下发一个带有加密签名和时间戳的Cookie。然后在云WAF自定义防盗链规则中,检查这个Cookie的值是否合法。比如,你可以用正则表达式验证Cookie中的token字段是否符合预期的格式和时效性。任何没有这个Cookie,或者Cookie解不开、过期的请求,即便Referer伪造得再完美,也会被拒绝。这实际上把防盗链和业务鉴权在边缘节点就完成了,极大减轻了源站压力。
甚至,你可以利用云WAF注入的扩展头。比如,某些云WAF在解密HTTPS流量后,会向源站传递一个标识客户端真实IP的头(如X-Real-IP或X-Forwarded-For)。在自定义防盗链规则中,你可以基于这个IP进行地理区域限制,只允许特定国家或地区的用户访问资源,这对于有版权地域限制的内容分发简直是杀手锏。
实战场景:构建三道防线,让盗链者无处遁形一个健壮的防盗链体系,不应该是一条规则包打天下,而是一套分层次的、递进式的防御策略。我建议你按照以下三道防线来配置你的云WAF自定义防盗链规则。
第一道防线:通用资源的基础过滤。针对jpg、png、gif、css、js、woff2等公开的静态资源。规则逻辑可以设计为:
(请求方法为GET)且(URI后缀匹配静态资源正则)且(Referer为空或Referer不包含白名单域名)。
处理动作不要直接拦截,而是设置为“观察”或“重定向到一张警示图片”。直接拦截可能误伤某些关闭了Referer传递的合法用户或浏览器隐私模式。重定向到一张写着“请通过本站访问”的图片,既能保护带宽,又能提醒用户,体验更好。
第二道防线:敏感接口的严格鉴权。针对/api/download、/api/export、/api/getfile这类会消耗服务器性能和带宽的动态接口。规则逻辑要严格得多:
(请求URI匹配/api/.*)且(请求头Authorization不存在或Cookie中token校验失败)且(Referer不匹配白名单)。
这里的处理动作必须是“拦截”或“人机验证”。同时,在这条规则里,你要开启“频率限制”的附加条件。比如,同一IP在1分钟内请求同一接口超过10次,直接封禁该IP一段时间。这能有效防止通过脚本反复刷接口盗取数据的行为。
第三道防线:针对性的陷阱与反制。这是最有意思的部分,也是自定义逻辑的用武之地。你可以故意在你的网页HTML源码中,埋一个正常用户浏览器不可见、但爬虫会抓取到的链接,比如一个隐藏的图片或样式文件,其URI路径设计得很有规律,如/images/trap.jpg。然后在云WAF里专门为这个URI创建一条规则:
(请求URI等于“/images/trap.jpg”)且(Referer不为空)。
因为正常用户通过你的网站访问,浏览器是不会加载这个隐藏元素的,所以Referer应该为空。而任何带着你网站Referer来请求这个陷阱文件的,100%是解析了HTML的爬虫或盗链工具。一旦命中这条规则,动作就是“永久封禁IP”或“标记为恶意Bot”。这种“蜜罐”式的防盗链,反制效果极佳。
绕过与反绕过:你必须知道的攻防细节道高一尺,魔高一丈。了解常见的绕过手段,你才能配置出真正有效的规则。
Referer伪造是基础操作。攻击者可以在请求头中轻易地设置Referer为你的域名。这就是为什么不能单独依赖Referer的原因。你的规则必须结合其他维度。一个非常有效的反制手段是“Origin头校验”。浏览器在发起跨域Ajax请求时,会自动带上Origin头,且这个头在脚本中是无法被伪造的(浏览器安全策略)。如果你的资源是通过Ajax加载的,那么校验Origin头比校验Referer可靠得多。规则可以写为:对于XMLHttpRequest请求,Origin必须为你的域名,否则拦截。
空Referer的滥用。很多“防盗链教程”会建议你允许空Referer,以照顾用户体验。但攻击者恰恰会利用这一点,通过在HTTPS下请求HTTP资源、使用data URL、或者直接在地址栏打开等方式,让请求不带Referer。更精细的做法是,不要一刀切地允许空Referer。你可以结合请求资源的类型来判断:对于图片、CSS、字体等页面渲染必需的子资源,允许空Referer;但对于视频、下载文件等高价值资源,拒绝空Referer,并要求必须提供合法的Referer或鉴权信息。
更高级的,是Headless浏览器(无头浏览器)的模拟访问。它能执行JavaScript,能设置完整的请求头,行为上和一个真实浏览器几乎无异。面对这种“完全模拟”,前述所有静态规则都可能失效。此时,你的云WAF自定义防盗链必须升级到行为分析层面。在规则中引入“客户端行为验证”的逻辑,比如要求客户端必须执行一段JavaScript挑战(计算、重定向),或者检查客户端是否支持特定的TLS指纹、是否具备完整的浏览器渲染环境特征。虽然这已经部分超出了传统防盗链规则的范畴,但顶尖的云WAF允许你在自定义规则中调用其Bot管理模块的检测结果作为条件,比如:
(请求URI匹配高价值资源)且(Bot检测得分小于阈值)则拦截。
这实际上是把防盗链和反Bot无缝结合了起来,是当前最有效的防御思路。
配置实例:用逻辑表达式构建一条复合规则假设你有一个文档预览服务,PDF文件存储在/doc/路径下。需求如下:
1. 只允许来自你自己主站(www.example.com)和子域名(app.example.com)的页面引用。
2. 必须是通过浏览器直接访问,排除绝大多数脚本。
3. 每个IP每分钟最多下载5次。
4. 对来自特定地区的请求直接放行,不进行频率限制。
在支持自定义逻辑表达式的云WAF控制台,你可以这样编写规则条件(伪代码,具体语法视厂商而定):
( (http.host eq "doc.example.com") and (http.uri matches "/doc/.*\.pdf") )
and
(
(
(http.referer contains "www.example.com") or
(http.referer contains "app.example.com")
)
and
(http.user_agent not_empty)
and
(http.user_agent not_contains ["scrapy", "curl", "wget", "python-requests"])
)
and
(
(geo.country_code in ["US", "CA"])
or
(rate.limit(ip, 5, 60) eq true)
)
这个表达式清晰地展示了“运算”的力量。它将域名限制、来源限制、客户端特征检查和频率/地域控制,用逻辑运算符严密地组织在了一起。任何一项不满足,整个条件即为假,请求就会被规则的动作(如拦截或验证码)处理掉。这种精确到毛孔的控制力,是传统防盗链配置无法企及的。
云WAF的自定义防盗链,本质上是把安全策略的编写权,从安全厂商预设的模板里,真正交还给了最懂业务的你。它不再是一个简单的开关,而是一套可编程的边缘安全逻辑。用好它,你需要深入理解你的业务场景、资源分布和用户行为,然后像一名架构师一样,去设计你的防御逻辑。这不再是配置几个参数,而是在边缘节点上,为你的内容资产编写一部量身定制的安全法典。
