什么是防盗链?
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
重载配置文件:
[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