nginx防盗链

本篇文章可以参考:https://segmentfault.com/a/1190000018001501

一般都是根据请求报文的referer来做防盗链的

比如51cto文章中的图片,经常看到网上很多人转载51cto的文章,但图片都不能访问,单独拿出图片链接到浏览器打开就可以访问,

用curl来模拟访问,不加referer可以正常访问:

加了别的referer就是403

加了含有blog.51cto.com的refert就是正常

正常的referer信息,可以通过不同的访问方式查看日志看到

none:请求报文没有referer首部,比如curl访问,直接输入网址到浏览器,日志中显示的是'-'
blocked:请求报文中有referer首部,但无有效值,比如空,比如通过curl -e '' https://www.uscwifi.cn访问,日志中显示的是'';前端时间新浪图床不能用后某些大佬就通过设置referer空来实现访问。
server_names:从那个网站跳过来的,

referer可以伪造,比如curl -e就可以伪造

在图片的location里加个判断,不是本域名就拒绝

location ~* \.(gif|jpg|png|jpeg)$ {			#不区分大小写的匹配,匹配各种图片
    #none blocked保证用户在新页面打开时依然能够打开,如果不希望用户能够保存删掉这两项
    #valid_referers none blocked *.hugao8.com *.baidu.com *.google.com;
    valid_referers none *.myblog.cn *.baidu.com *.google.com;
    if ($invalid_referer) {
        return 403;	#这里可以返回一个自定义图片的链接,网上很多文章,可以看到微信图片,未经授权不得引用的字样,就是盗用了微信的图片
    }
}

之前公司网站的nginx这么配置

这是一个nginx模版,需要的时候可以在里面加referer判断,不写的话就没用

#写的空,这就是不会执行任何操作,不影响访问,继续执行其他location
location ~* \.(gif|jpg|png|jpeg)$ {	
}

referer的伪造

curl -e只能终端访问伪造,网站怎么办?

可以百度新浪图床 403新浪图床打不开,会有很多惊喜,网友给的临时解决办法:

办法一:

#参考:https://www.v2ex.com/t/558239
img 中添加参数<img src="" referrerPolicy="no-referrer">

办法二:

参考:https://www.willnet.net/index.php/archives/141/
在HTML代码的head中添加一句<meta name="referrer" content="no-referrer" />

办法三:

参考:https://www.kehu56.com/operation/628.html

测试方法三:

nginx正常配置:

测试页面

[root@imooc-nginx html]# cat 2.html 
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<a href="https://s1.51cto.com/images/20191029/1572337051565645.png">图片测试</a>

访问失败:403

修改nginx配置:51cto的图片空referer是可以访问的

add_header参考:http://nginx.org/en/docs/http/ngx_http_headers_module.html#add_header

Referrer Policy可以参考:https://www.cnblogs.com/caixw/p/referrer-policy.html

cat /etc/nginx/conf.d/www.uscwifi.cn.conf

server {
    listen 80;
    listen 443 ssl;
    server_name www.uscwifi.cn;
    add_header Referrer-Policy "no-referrer";
    #auth_basic pleaseinputpasswd;
    #auth_basic_user_file /etc/nginx/passwd;
    if ($scheme = http){
        return 301  https://$server_name$request_uri;
    }
    location ~* \.(gif|jpg|png|jpeg)$ {	
        valid_referers none  *.uscwifi.cn *.baidu.com *.google.com;
        if ($invalid_referer) {
            return 403;
        }
    }
    root /var/www/html;
    index index.html;
    access_log /var/log/nginx/www.uscwifi.cn-access.log;
    error_log /var/log/nginx/www.uscwifi.cn-error.log;
    ssl_certificate /etc/nginx/ssl/www.uscwifi.cn.crt;
    ssl_certificate_key /etc/nginx/ssl/www.uscwifi.cn.key;
    ssl_protocols       SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
}

然后就可以访问了。不过这样肯定会影响baidu的收录