Nginx防盗链配置/访问控制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Powerful_Fy/article/details/102594093

什么是防盗链?

1.分别有两个网站A和B,A网站通过http地址引用了B网站的图片,这就叫做盗链
2.防盗链:防止A引用B网站的图片

当前B网站www.blog.com下有一张图片5.jpg,访问测试:

[root@linux ~]# curl -I -x127.0.0.1:80  http://www.blog.com/5.jpg
HTTP/1.1 200 OK

#http状态码200,可以访问该图片

使用A网站test.bbs.com引用B网站www.blog.com的图片5.jpg:

[root@linux ~]# curl -I -x127.0.0.1:80 -e http://test.bbs.com/5.jpg http://www.blog.com/5.jpg
HTTP/1.1 200 OK

#http状态码200,A网站成功引用了B网站的图片5.jpg

配置nginx防盗链:

打开nginx虚拟主机配置文件(B网站www.blog.com的配置文件):

[root@linux ~]# vi /etc/nginx/conf.d/default.conf 

添加如下配置:

location ~ \.(png|gif|jpeg|bmp|mp3|mp4|flv|jpg)$
{
    valid_referers none blocked server_names *.blog.com;
    if ($invalid_referer) {
           return 403;
        }
}

#location的对象为.png/.gif/.jpeg/.bmp/.mp3/.mp4/.flv/.jpg表示防止引用的对象是这些格式的文件,server_names:指定白名单地址,非白名单地址对图片的引用将会返回http状态码403

重载配置文件:

扫描二维码关注公众号,回复: 7571065 查看本文章
[root@linux ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@linux ~]# nginx -s reload

测试:

访问B网站www.blog.com的图片5.jpg:

[root@linux ~]# curl -I -x127.0.0.1:80  http://www.blog.com/5.jpg
HTTP/1.1 200 OK

#http状态码200,可以访问(因为nginx防盗链设置的白名单为*.blog.com)

再次使用A网站test.bbs.com引用B网站www.blog.com的图片5.jpg:

[root@linux ~]# curl -I -x127.0.0.1:80 -e http://test.bbs.com/5.jpg http://www.blog.com/5.jpg
HTTP/1.1 403 Forbidden

#http状态码403,防盗链配置成功,白名单外的地址已无法引用B网站www.blog.com下的5.jpg

nginx访问控制:

nginx限制IP访问网站:

1.设置白名单:
在这里插入图片描述
#在虚拟主机配置文件中allow指定允许访问的地址为127.0.0.1,允许访问的网段为192.168.234.0/24,dney all 拒绝除允许的IP和IP段以外的所有地址访问

测试:

白名单IP:127.0.0.1

[root@linux ~]# curl -I -x127.0.0.1:80  http://www.blog.com/
HTTP/1.1 200 OK

#http状态码200,可以访问

白名单网段192.168.234.0/24中的IP:

[root@linux ~]# curl -I -x192.168.234.128:80 http://www.blog.com/
HTTP/1.1 200 OK

#http状态码200,可以访问

白名单之外的IP:

[root@linux ~]# curl -I -x192.168.1.100:80 http://www.blog.com/
HTTP/1.1 403 Forbidden

#http状态码403,拒绝访问

补充:-x指定的IP地址得是本地存在且在使用的IP

2.设置黑名单:
在这里插入图片描述
#deny将127.0.0.1设置为黑名单,除127.0.0.1之外的IP都能访问

测试:

黑名单IP 127.0.0.1:

[root@linux ~]# curl -I -x127.0.01:80 http://www.blog.com/
HTTP/1.1 403 Forbidden

#http状态码403,拒绝访问

黑名单以外的IP 192.168.234.128:

[root@linux ~]# curl -I -x192.168.234.128:80 http://www.blog.com/
HTTP/1.1 200 OK

#http状态码200,可以访问

nginx限制IP访问指定目录:

测试网站www.blog.com下有个目录为admin/,限制IP访问该目录,编辑nginx虚拟主机配置文件,添加以下内容:
在这里插入图片描述
#允许192.168.234.0/24网段的IP访问/admin目录,拒绝127.0.0.1访问/admin

测试:

允许访问的IP:

[root@linux ~]# curl -I -x192.168.234.128:80 www.blog.com/admin/a.txt
HTTP/1.1 200 OK

#http状态码200,可以访问

禁止访问/admin目录的IP 127.0.0.1:

[root@linux ~]# curl -I -x127.0.0.1:80 www.blog.com/admin/a.txt
HTTP/1.1 403 Forbidden

#http状态码403,拒绝访问

nginx限制IP访问指定目录下的某类文件:

测试网站www.blog.com下有个目录为admin/,该目录中有很多.php的文件,为了安全,需要限制所有IP访问该目录下的.php文件,编辑nginx虚拟主机配置文件,添加如下内容:

location ~ .*(upload|admin)/.*\.php$
	{
     	deny all;
	}

#该配置表示禁止所有IP访问upload/和admin/目录下的所有.php文件

测试:

[root@linux ~]# curl -I -x127.0.0.1:80 www.blog.com/admin/login.php
HTTP/1.1 403 Forbidden

#http状态码403,拒绝访问

nginx通过user-agent访问标识限制爬虫:

当网站访问日志中user-agent出现大量异常的访问标识时(比如:Spider/3.0、YoudaoBot、Tomato等),可以通过限制user-agent包含的关键字符拒绝爬虫,节省服务器带宽等

编辑nginx虚拟主机配置文件添加以下内容:

if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
    {
        return 403;
    }

#该配置表示当匹配到user-agent访问表示中包含Spider/3.0、YoudaoBot、Tomato等关键词的时候,拒绝访问

测试:

[root@linux ~]# curl -I -A 'testSpider/3.0' -x127.0.0.1:80 www.blog.com
HTTP/1.1 403 Forbidden

#http状态码403,拒绝访问(curl -A参数:指定user-agent标识)

nginx通过$request_uri匹配关键字限制访问:

什么是$request_uri ?

request_uri :请求的链接,包括$document_uri和$args

测试用url:http://test.bbs.com/home.php?mod=space&uid=1&do=profile

uri:home.php?mod=space&uid=1&do=profile

document_uri:home.php

args:mod=space&uid=1&do=profile

通过匹配uri 中的关键词进行访问限制,编辑nginx虚拟主机配置文件添加以下内容:

if ($request_uri ~ (abc|999))
        {
            return 403;
        }

#当uri 中包含关键词abc或999时,将拒绝访问

测试:

访问测试用url:

[root@linux ~]# curl -I -x127.0.0.1:80 http://test.bbs.com/home.php?mod=space&uid=1&do=profile
HTTP/1.1 200 OK

#http状态码200,可以访问

将uri中document_uri 更改为abc.php:

[root@linux ~]# curl -I -x127.0.0.1:80 http://test.bbs.com/abc.php?mod=space&uid=1&do=profile
HTTP/1.1 403 Forbidden

#htpp状态码403,拒绝访问

将uri中args 加入999关键词:

[root@linux ~]# curl -I -x127.0.0.1:80 http://test.bbs.com/home.php?mod=space999&uid=1&do=profile
HTTP/1.1 403 Forbidden

#http状态码403,拒绝访问

补充:

当在nginx虚拟主机配置文件中添加的内容为 if 判断时,不可以限制指定IP,只能return返回http状态码,限制指定的IP只能在全局或者location中直接allow或deny

猜你喜欢

转载自blog.csdn.net/Powerful_Fy/article/details/102594093