设置防盗链
防盗链的作用是,我们网站的图片,只能通过我们自己的网站去访问,其他网站借用不行。
比如:我们的网站,被用户上传了很多图片,而用户又在他自己的网站上加上了我们网站图片的链接,就直接能访问了。
这样可以节省他网站的带宽
一、图片防盗链原理
http标准协议中有专门的字段记录referer
一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么
因此所有防盗链方法都是基于这个Referer字段
如果是直接在浏览器上输入地址,回来进来,则没有referer头。
这也是:为什么服务器知道我们的图片是从哪儿引用的,也知道我们的客户从哪个网站链接点击过来的
referer防盗链的配置文件:
<Directory /data/wwwroot/www.123.com>//用来定义那个目录,就是站点所在目录
SetEnvIfNoCase Referer "http://www.123.com" local_ref //定义referer的白名单
SetEnvIfNoCase Referer "http://123.com" local_ref //定义referer的白名单
SetEnvIfNoCase Referer "^$" local_ref //定义referer的白名单(空的referer,直接输入网址进去的,没经过其他网站跳转)
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> //定义规则,针对那些访问做防盗链
Order Allow,Deny //定义访问控制的
Allow from env=local_ref //允许白名单的referer
</filesmatch>
</Directory>
在Apache设置防盗链:
打开虚拟配置文件:
[root@shuai-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.111.com www.example.com
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>
SetEnvIf Request_URI ".*\.gif$" img
SetEnvIf Request_URI ".*\.jpg$" img
SetEnvIf Request_URI ".*\.png$" img
SetEnvIf Request_URI ".*\.bmp$" img
SetEnvIf Request_URI ".*\.swf$" img
SetEnvIf Request_URI ".*\.js$" img
SetEnvIf Request_URI ".*\.css$" img
ErrorLog "logs/111.com-error_log"
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
</VirtualHost>
保存退出,检查配置文件语法并重新加载配置文件
[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
这是只有通过referer白名单的才能访问:
用curl测试:
curl -e 可以指定referer:在白名单里
[root@shuai-01 ~]# curl -e "http://111.com/123.txt" -x127.0.0.1:80 111.com/logo.png -I
HTTP/1.1 200 OK
Date: Mon, 25 Dec 2017 09:33:36 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Last-Modified: Thu, 21 Dec 2017 14:12:26 GMT
ETag: "1914-560da4a1b6680"
Accept-Ranges: bytes
Content-Length: 6420
Content-Type: image/png
不在白名单里的
[root@shuai-01 ~]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/logo.png -I
HTTP/1.1 403 Forbidden
Date: Mon, 25 Dec 2017 09:36:02 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
用浏览器测试:
在白名单里的(这里是空的referer)
不在白名单里:
问题1:
查看日志的时候,明明访问了多次站点,却没有日志。
原因:这里由于访问的是图片,由于以前做过日志不记录静态文件,配置文件没有更改或删除,访问.png时,就没记录。
更改配置文件,将其注释掉。
访问控制
访问控制和用户认证其实是不一样的,用户认证是通过用户名密码的方式允许访问,访问认证是通过允许IP白名单允许访问。
访问控制的配置文件:
<Directory /data/wwwroot/www.123.com/admin/> //针对admin目录
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
order用来定义顺序,是先deny(不允许),allow(允许)。
Order deny,allow
Deny from all
Allow from 127.0.0.1
这里先所有都不允许,在只允许127.0.0.1 。执行完后才生效。
如果:
Order allow,deny
Deny from all
Allow from 127.0.0.1
先allow在deny。就所有都不允许了。
设置admin文件的访问控制:
打开虚拟配置文件
[root@shuai-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
//设置访问控制
<Directory /data/wwwroot/111.com/admin/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
//设置防盗链
<Directory /data/wwwroot/111.com>
SetEnvIfNoCase Referer "http://111.com" local_ref
SetEnvIfNoCase Referer "http://weibo.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
</Directory>
保存退出,检查配置文件语法并重新加载配置文件
[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
创建admin文件:
[root@shuai-01 ~]# cd /data/wwwroot/111.com/
[root@shuai-01 111.com]# mkdir admin/
[root@shuai-01 111.com]# touch admin/index.php
[root@shuai-01 111.com]# echo '121212' > admin/index.php
[root@shuai-01 111.com]# cat admin/index.php
121212
通过curl进行测试:
自测试:
[root@shuai-01 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Mon, 25 Dec 2017 10:27:40 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
[root@shuai-01 111.com]# curl -x192.168.176.135:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Mon, 25 Dec 2017 10:28:56 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1
前面访问控制是目录,它还能是一个文件。
<Directory /data/wwwroot/www.123.com> //在那个目录下
<FilesMatch "admin.php(.*)">
//对于那些文件
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>