0°

Nginx 防盗链简单配置

为什么需要防盗链?

  1. 放置爬虫直接来抓取图片
  2. 防盗链需要根据referer来判断

日志格式

配置防盗链需要日志格式中包含 $http_referer$http_user_agent
$http_refere:抓取客户端上一个网址,例如:客户端是通过www.baidu.com来的 https://k8sops.cn,那么客户端上一个网址就是 www.baidu.com。
$http_user_agent:抓取客户端访问站点的途径,例如客户端是通过 chrome firefox 等浏览器访问或者使用 curl wget python 等工具访问。

我的日志格式如下:

 log_format  main  '$remote_addr" "$remote_user" "$time_iso8601" "$request"'
                   ' "$status" "$body_bytes_sent" "$connection" "$connection_requests" "$http_referer"'
                   ' "$http_user_agent" "$http_x_forwarded_for" "$gzip_ratio" "$request_time"'
                   ' "$upstream_addr" "$upstream_response_time" "$upstream_status" "$http_host"';
 access_log  logs/access.log  main;

防盗链配置

       location ~ \.(png|jpg|jpeg|svg|ico|gif)$ {
           if ($http_referer !~ 'k8sops.cn') {
               return 403;
               break;
           }
           if ($http_user_agent ~ 'wget|curl|python') {
               return 403;
           }
       }

配置说明:
如果访问结尾为 .png .jpg .jpeg .svg .ico .gif 格式的文件将进行以下两次if判断
if ($http_referer !~ 'k8sops.cn') 判断日志中的 $http_referer 值是否不包含了 k8sops.cn,如果不包含 k8sops.cn 则证明此访问不是通过 k8sops.cn 网站来进行访问的,则返回 403 给拒绝掉,如果发现 $http_referer 值中包含了 k8sops.cn 则 break 跳出这个判断,开始进行下面一个判断。

if ($http_user_agent ~ 'wget|curl|python') 判断日志中 $http_user_agent 值是否是 wget curl python方式来访问的 k8sops.cn,如果是以此方式,则证明不是通过浏览器访问,那么将返回 403 给拒绝掉。

以上方式只能防御简单的爬虫,以下给出破解上方两种破解的方法:

1.伪装客户端上次地址:$http_referer
curl 127.0.0.1/k8sops.png --referer "k8sops.cn"
通过curl加 --referer 方式来破解第一个判断条件:
curl 127.0.0.1/k8sops.cn 访问本机地址,后面跟上 k8sops.cn 的图片路径,使用 --referer 指定域名 "k8sops.cn" 以达到伪装效果

2.伪装客户端使用的浏览器 $http_user_agent
curl https://k8sops.cn/k8sops.jpg --user-agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"
通过--user-agent来伪装一个浏览器以达到伪装目的






「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论