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的收录