在阿里云 DCDN 里使用 EdgeScript 实现防盗链

阿里云全站加速 DCDN 自带 Referer 防盗链的能力,但只能全局配置,不能进一步根据请求或文件类型做不同的处理,如果网站的所有请求都走 DCDN,那你可能就掉坑里了。

坑在哪呢?对网页 HTML 的请求不能加防盗链,否则会导致用户无法从其它网站打开你的页面,除非它们的 a 标签指定了 noreferrer。这个问题不能通过添加白名单的方式解决,因为你不知道外链会出现在哪些网站上,同时它们也不一定是可信的。

还好 DCDN 有 EdgeScript,允许我们在边缘节点上执行一段请求处理脚本,来实现访问控制、限流等等自定义逻辑,非常灵活。下面是我的脚本代码示例:

if ne(req_uri_ext(), '') {
allow_re = 're:^https?://(\w+\.)*example\.com(/.*)?$'
if and(ne(req_referer(), ''), not(req_referer(allow_re))) {
exit(403)
}
}

这段脚本会在每个请求处理开始时运行。逻辑很简单,一般需要做防盗链的是静态资源文件,这些文件的请求都有后缀名,而 HTML 和 API 的请求是不带的,所以我们可以通过请求的后缀名来判断是否执行防盗链逻辑,如果需要防盗链,当 Referer 不为空且域名不是 example.com 或其子域名的时候,就返回 403。