linux 学习笔记-043-Apache 配置 referer 防盗链,访问控制参数

发布于 2018-03-06  403 次阅读


配置 referer 防盗链

什么叫盗链:很多站点都会发生图片盗链或者文件盗链,即是别人的网站使用你服务器上的文件或者图片的链接从而节省自己的服务器的带宽资源,但会消耗你自己的服务器的带宽资源

什么叫防盗链:通过技术手段,使自己网站的图片、文件只能在自己的网站做引用,其他网站不能引用

什么叫 Referer 防盗链:Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 Referer,会告诉服务器我是从哪个页面链接过来的,而做了 Referer 防盗链,只要你这个 Referer 不是我所指定的,则会链接失败

[root@am-01:~#] vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  <Directory /data/wwwroot/111.com>

          SetEnvIfNoCase Referer "http://111.com" local_ref

          SetEnvIfNoCase Referer "https://www.itwordsweb.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@am-01:~#] /usr/local/apache2.4/bin/apachectl -t

Syntax OK

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl graceful

#在虚拟主机配置文件添加一段<Directory></Directory>,SetEnvIfNoCase Referer "http://111.com" local_ref 这句的意思是设置 http://111.com 为白名单,下面两句同一意思(最后一个为允许为空 Referer,这里暂时注释掉);<filesmatch></filesmatch>这一段是用来定义规则;因为之后的实验需要,把 www.itwordsweb.com 也加入到白名单中

#最后测试一下配置文件的正确性并重载一下

测试防盗链

直接在客户端浏览器访问 http://111.com/1.png,可以见到无法访问,这里是因为把允许空 Referer 注释掉了

linux 学习笔记-043-Apache 配置 referer 防盗链,访问控制参数

在 042 文章发回复信息,用来测试防盗链,可以见到可以从https://www.itwordsweb.com/279.html链接访问图片

linux 学习笔记-043-Apache 配置 referer 防盗链,访问控制参数

linux 学习笔记-043-Apache 配置 referer 防盗链,访问控制参数

[root@am-01:~#] vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  SetEnvIfNoCase Referer "^$" local_ref

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl -t

Syntax OK

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl graceful

#把允许空 Referer 行的注释去掉,最后测试一下配置文件的正确性并重载一下

在客户端浏览器测试是否可以直接访问图片,可以见到这时直接访问图片链接也可以显示图片了

linux 学习笔记-043-Apache 配置 referer 防盗链,访问控制参数

linux 虚拟机用 curl 模拟 Referer

[root@am-01:~#] curl -e http://www.aaa.com/ -x172.17.1.240:80 111.com/1.png -I

HTTP/1.1 403 Forbidden

Date: Tue, 06 Mar 2018 15:42:39 GMT

Server: Apache/2.4.29 (Unix) PHP/7.1.6

Content-Type: text/html; charset=iso-8859-1

[root@am-01:~#] curl -e https://www.itwordsweb.com/ -x172.17.1.240:80 111.com/1.png -I

HTTP/1.1 200 OK

Date: Tue, 06 Mar 2018 15:42:27 GMT

Server: Apache/2.4.29 (Unix) PHP/7.1.6

Last-Modified: Mon, 05 Mar 2018 15:22:14 GMT

ETag: "1505-566abe402ca24"

Accept-Ranges: bytes

Content-Length: 5381

Content-Type: image/png

#这里可以见到,使用非白名单的地址去链接这张图片,会提示 403 错误的,使用白名单的地址去链接这张图片则返回 200 状态码,-e 可以指定 Referer,并且 Referer 必须要是 http://开头

访问控制 Directory

为了安全性,有时候是会要求网站后台或者某个页面只能某些 IP 能访问,其他 IP 去访问则被拒绝

主要为控制目录

[root@am-01:~#] vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  <Directory /data/wwwroot/111.com/admin/index.php>

          Order deny,allow

          Deny from all

          Allow from 127.0.0.1

  </Directory>

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl -t

Syntax OK

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl graceful

#修改虚拟主机配置文件,把<Directory></Directory>这段写入到配置文件中,为了和其他的<Directory></Directory>产生冲突,建议放在其他的<Directory></Directory>上面

#Order 用来定义 deny 和 allow 的执行顺序,假如 127.0.0.1 要访问,这里会是先拒绝,再允许

#最后测试一下配置文件的正确性并重载一下

测试:

linux 下使用 curl 测试

[root@am-01:~#] curl -x127.0.0.1:80 111.com/admin/index.php -I

HTTP/1.1 200 OK

Date: Tue, 06 Mar 2018 16:16:22 GMT

Server: Apache/2.4.29 (Unix) PHP/7.1.6

X-Powered-By: PHP/7.1.6

Content-Type: text/html; charset=UTF-8

[root@am-01:~#] curl -x172.17.1.240:80 111.com/admin/index.php -I

HTTP/1.1 403 Forbidden

Date: Tue, 06 Mar 2018 16:18:21 GMT

Server: Apache/2.4.29 (Unix) PHP/7.1.6

Content-Type: text/html; charset=iso-8859-1

#可见 172.17.1.240 这个 IP 访问 111.com/1.png 是会被拒绝的

windows 客户端浏览器测试

可见客户端 IP 不在允许列表,是无法访问这个页面的,如果客户端要访问这个页面,就要在配置文件中把客户端的 IP 地址添加进去

PS:假如客户端的网段跟虚拟机网段不同,但事实上客户端是可以跟虚拟机通讯的,你把客户端 IP 添加到配置文件中也无法访问这个页面的话,这时只需把虚拟机的网关添加进去即可

linux 学习笔记-043-Apache 配置 referer 防盗链,访问控制参数

访问控制 FilesMatch

有时候,一个链接地址可能会有各种各样的参数,例如:http://111.com/admin/index.php?155asd 之类的,这时就需要使用 FilesMatch 来定义访问控制了

主要为控制页面或者链接

[root@am-01:~#] vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  <Directory /data/wwwroot/111.com>

          <FilesMatch  "admin.php(.*)">

              Order deny,allow

              Deny from all

              Allow from 127.0.0.1

          </FilesMatch>

  </Directory>

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl -t

Syntax OK

[root@am-01:~#] /usr/local/apache2.4/bin/apachectl graceful

#修改上文中的<Directory></Directory>,定义一些特殊的规则

#最后测试一下配置文件的正确性并重载一下

使用 curl 测试:

[root@am-01:~#] curl -x127.0.0.1:80 '111.com/admin.php?asd' -I

HTTP/1.1 200 OK

Date: Tue, 06 Mar 2018 16:56:46 GMT

Server: Apache/2.4.29 (Unix) PHP/7.1.6

X-Powered-By: PHP/7.1.6

Content-Type: text/html; charset=UTF-8

[root@am-01:~#] curl -x172.17.1.240:80 '111.com/admin.php?asd' -I

HTTP/1.1 403 Forbidden

Date: Tue, 06 Mar 2018 16:56:51 GMT

Server: Apache/2.4.29 (Unix) PHP/7.1.6

Content-Type: text/html; charset=iso-8859-1

#可见,使用允许的 IP 是返回 200 状态码,使用不允许的 IP 是返回 403 状态码,因为有特殊符号,建议加单引号或者双引号

扩展

几种限制 ip 的方法:

http://ask.apelearn.com/question/6519

apache 自定义 header:

http://ask.apelearn.com/question/830

apache 的 keepalive 和 keepalivetimeout:

http://ask.apelearn.com/question/556