设置防盗链,访问控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen112826473/article/details/79956350

设置防盗链

防盗链的作用是,我们网站的图片,只能通过我们自己的网站去访问,其他网站借用不行。 
比如:我们的网站,被用户上传了很多图片,而用户又在他自己的网站上加上了我们网站图片的链接,就直接能访问了。 
这样可以节省他网站的带宽

一、图片防盗链原理 
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>
阅读更多

没有更多推荐了,返回首页