设置防盗链,访问控制
来源:互联网 发布:在线字体生成网站源码 编辑:程序博客网 时间:2024/05/18 01:54
设置防盗链
防盗链的作用是,我们网站的图片,只能通过我们自己的网站去访问,其他网站借用不行。
比如:我们的网站,被用户上传了很多图片,而用户又在他自己的网站上加上了我们网站图片的链接,就直接能访问了。
这样可以节省他网站的带宽
一、图片防盗链原理
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 -IHTTP/1.1 200 OKDate: Mon, 25 Dec 2017 09:33:36 GMTServer: Apache/2.4.29 (Unix) PHP/5.6.30Last-Modified: Thu, 21 Dec 2017 14:12:26 GMTETag: "1914-560da4a1b6680"Accept-Ranges: bytesContent-Length: 6420Content-Type: image/png
不在白名单里的
[root@shuai-01 ~]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/logo.png -IHTTP/1.1 403 ForbiddenDate: Mon, 25 Dec 2017 09:36:02 GMTServer: Apache/2.4.29 (Unix) PHP/5.6.30Content-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 -IHTTP/1.1 200 OKDate: Mon, 25 Dec 2017 10:27:40 GMTServer: Apache/2.4.29 (Unix) PHP/5.6.30X-Powered-By: PHP/5.6.30Content-Type: text/html; charset=UTF-8[root@shuai-01 111.com]# curl -x192.168.176.135:80 111.com/admin/index.php -IHTTP/1.1 403 ForbiddenDate: Mon, 25 Dec 2017 10:28:56 GMTServer: Apache/2.4.29 (Unix) PHP/5.6.30Content-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>
关于Apache的访问限制:
https://jingyan.baidu.com/article/4b07be3c193d1648b380f3a9.html