Nginx-防盗链

原理

对于一些静态资源,特别是媒体文件,我们不希望自己的文件被其他网站通过超链接直接访问到,通过nginx配置可以实现这一愿景。

点击超链接跳转时,浏览器都会为请求添加一个 referer 的请求头,值为跳转前的网站地址。通过这个请求头标识 nginx 就能知道请求是从哪里来的。据此我们设置好规则,就能阻止不符合要求的来源了。

示例

server {
        listen 80;
        server_name blogs.systemcaller.cloud; 

                location ~* \\.(js|css|png|jpg|jpeg|gif)$ {
  # 防盗链
                valid_referers ~.*systemcaller.cloud;
                if ($invalid_referer) { 
                        return 403; 
                }
  # 静态缓存
            expires 7d;
            root /usr/share/nginx/html/wordpress_data;
}

上面的示例 valid_referers server_names ~.*systemcaller.cloud ; 是重点。

valid_referers 是 nginx 的关键字表示对 referer 请求头进行判断,判断时我写了一个正则表达式 ~.*systemcaller.cloud ,他的意思是来源中包含 systemcaller.cloud 的就认为合法,否则不合法。

再下面的 if 判断 $invalid_referer 在合法时值为0,不合法时为 1 , 为1 就会直接返回403错误码。也可以根据需要路由到一个自定义页面,友好的显示。

扩展

valid_referers 详细的语法规则

valid_referers | none | blocked | server_names | 正则表达式;
  • none: 请求头中不存在 Referer 字段(比如直接在浏览器地址栏输入 URL)。
  • blocked: 请求头中存在 Referer 字段,但值不是以 "http(s)://" 开头的字符串(被防火墙或代理服务器修改删除)。
  • server_names: Referer 字段包含服务器名称。
  • 正则表达式必须以 ~ 开头,值得注意的是,正则匹配的是在“http://”或“https://”之后的内容

可以通过 curl -e www.baidu.com -i www.test.com 来快速测试。 -e 是指定 referer 的值。

其他方式

实际上使用 referers 来进行防盗链,并不是绝对安全的,毕竟请求头还是很好伪造的。但是作为一种简单方式,还是分可取的,增加了盗链的操作难度。那么有没有其他更加安全的方式呢?

我提供几种方式,他们有点实现起来并不容易,代价很高,按需使用。

  1. 使用 token 对每个请求进行合法性校验
  2. 使用 ip 白名单来限制请求来源
  3. 对数据进行加密和数字签名
  4. 使用 CDN ,通常 CDN 提供了一些防盗链功能,开启他即可。
  5. 使用专门的防盗链工具
SystemCaller
SystemCaller

https://gravatar.com/noisily745e35dad0

文章: 47

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注