11.25 配置防盗链

什么是盗链 “盗链”的定义是:此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。 解决这个问题的方法是配置下防盗链,让外来的盗不了链,这里可以用两种方法实现 方法1:Apache防盗链的第一种实现方法,可以用rewrite实现。 (1)首先要确认Apache的rewrite module可用: 打开Apache主配,确保开启rewrite module配置

[root@localhost ~]# vi /usr/local/apache2.4/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so    #确保这行被开启

确认是否开启rewrite module参数

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -M|grep rewrite
rewrite_module (shared)

(2)在虚拟主机配置文件中添加以下内容

<Directory /data/111>                     
#防盗链配置
RewriteEngine On                                       
RewriteCond %{HTTP_REFERER} !^$       
RewriteCond %{HTTP_REFERER} !111\.com/.*$ [NC]          
RewriteCond %{HTTP_REFERER} !www\.111\.com/.*$ [NC] 
RewriteRule .*\.(gif|jpg|swf)$ http://www.111.com/about/nolink.png [R,NC,L]  
</Directory>

相关选项的解释

1.Directory                  ##指定针对的目录,一般是整个网站
2.RewriteEngine On  ##启用rewrite,要想rewrite起作用,必须要写上
3.RewriteCond    ## Rewrite的条件
4. %{HTTP_REFERER}:##服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。。
5.[ NC]                ##指的是不区分大小写,[R]强制重定向redirect
6.字母L表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则

防盗链配置的说明:

  1. RewriteCond %{HTTP_REFERER} 定义信任的网站referer,一般为自己的网站,^$表示空referer
  2. RewriteRule .*.(gif|jpg|swf)$要保护文件的扩展名(以|分开)。以这些为扩展名的文件。
  3. http://www.111.com/about/nolink.png 定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的about/ nolink.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。

当然你也可以不设置替换图片,而是使用下面的语句即可:

RewriteRule .*\.(gif|jpg|png)$ - [F]

注:[F] (强制URL为被禁止的forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。

(3) 创建about目录,把自定义nolink.png放上去

[root@localhost ~]# ll /data/111/about/nolink.png 
-rw-r--r-- 1 root root 0 7月   1 10:40 /data/111/about/nolink.png

(4)测试并重启

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

(5)用curl进行测试

[root@localhost ~]# curl -x192.168.66.131:80 111.com/images/123.jpg -I
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 02:43:25 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Last-Modified: Thu, 28 Jun 2018 09:38:32 GMT
ETag: "12bba-56fb07e9a7dc4"
Accept-Ranges: bytes
Content-Length: 76730
Content-Type: image/jpeg

curl -e指定referer

[root@localhost ~]# curl -e "http://qqq.com" -x192.168.66.131:80 111.com/images/123.jpg -I
HTTP/1.1 302 Found
Date: Sun, 01 Jul 2018 02:43:43 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Location: http://www.111.com/about/nolink.png
Content-Type: text/html; charset=iso-8859-1

可以看到已经跳转到自定义的显示的图片,测试成功 方法2:通过判断浏览器头信息来阻止某些请求,即利用SetEnvIfNoCase和access。这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量 在虚拟主机配置文件中加入

SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "www.111.com/.*$" local_ref
SetEnvIfNoCase Referer "111.com/.*$" local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif)">
#2.4版本以上,方法如下:
    Require all denied
    Require env local_ref
# 2.4版本以下的
#方法一:
#Order Deny,Allow
#  Allow from env=local_ref 
# Deny from all
#方法二:
#  Order Allow,Deny
# Allow from env=local_ref
</filesmatch>

检测并重启apache

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

用curl测试

[root@localhost ~]# curl -x192.168.66.131:80 111.com/images/123.jpg -I
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 03:03:58 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Last-Modified: Thu, 28 Jun 2018 09:38:32 GMT
ETag: "12bba-56fb07e9a7dc4"
Accept-Ranges: bytes
Content-Length: 76730
Content-Type: image/jpeg

用curl -e指定referer测试

[root@localhost ~]# curl -e "http://aaa.com" -x192.168.66.131:80 111.com/images/123.jpg -I
HTTP/1.1 403 Forbidden
Date: Sun, 01 Jul 2018 03:04:34 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

可以看到显示403,测试成功

11.26 访问控制Directory

有时候我们有这样的需求,让指定的目录,只能某些IP能访问,可以在配置文件中加入

<Directory /data/111/imeages>
 Order deny,allow
       Deny from all
      Allow from 127.0.0.1
</Directory>

测试语法并重启

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

用curl 测试

[root@localhost ~]# curl -x192.168.66.131:80 111.com/images/123.jpg -I
HTTP/1.1 403 Forbidden
Date: Sun, 01 Jul 2018 03:30:29 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

[root@localhost ~]# curl -x127.0.0.1:80 111.com/images/123.jpg -I
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 03:30:45 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Last-Modified: Thu, 28 Jun 2018 09:38:32 GMT
ETag: "12bba-56fb07e9a7dc4"
Accept-Ranges: bytes
Content-Length: 76730
Content-Type: image/jpeg

可以看到127.0.0.1可以成功访问,其他IP显示403

11.27 访问控制FilesMatch

针对某个文件进行控制 在虚拟主机配置文件中加入

<Directory /data/111>
    <FilesMatch  "admin.php(.*)">
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
</Directory>

测试语法并重启

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

用curl进行测试

[root@localhost ~]# curl -x192.168.66.131:80 111.com/admin.php -I
HTTP/1.1 403 Forbidden
Date: Sun, 01 Jul 2018 03:38:10 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

[root@localhost ~]# curl -x127.0.0.1:80 111.com/admin.php -I
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 03:38:15 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=GBK

可以看到访问admin.php只有127.0.0.1显示OK

11.28 限定某个目录禁止解析php

首先在images目录新建个1.php,写入

hello php[root@localhost ~]# ll /data/111/images/1.php 
-rw-r--r-- 1 root root 25 7月   1 12:33 /data/111/images/1.php
[root@localhost ~]# cat !$
cat /data/111/images/1.php
<?php
echo "hello php";

正常解析

[root@localhost ~]# curl -x192.168.66.131:80 111.com/images/1.php
hello php

在虚拟主机配置文件中加入以下见容

    <Directory /data/111/images>
        php_admin_flag engine off
    </Directory>

检测重启

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

再用curl访问images下的1.php

[root@localhost ~]# curl -x192.168.66.131:80 111.com/images/1.php
<?php
echo "hello php";

可以看到直接显示了源码,没有解析php

11.29 限制user_agent

user_agent可以理解为浏览器标识,有时候我们可以通过限制user_agent来防止一些非法访问 这里也是用到rewrite模块,先确认apache有没有加载rewrite模块 打开Apache主配,确保开启rewrite module配置

[root@localhost ~]# vi /usr/local/apache2.4/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so    #确保这行被开启

确认是否开启rewrite module参数

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -M|grep rewrite
rewrite_module (shared)

1在虚拟主机配置文件 中加入以下内容 <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_USER_AGENT} .curl. [NC,OR] RewriteCond %{HTTP_USER_AGENT} .baidu.com. [NC] RewriteRule .* - [F] </IfModule> 说明,上面语句的意思是打开rewrite引擎,如果user_agent包含curl或者baidu.com,[F] (强制URL为被禁止的forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的) 2检测重启apache

[root@localhost ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache2.4/bin/apachectl graceful

3用curl测试,-A可以指定user_agent

[root@localhost ~]# curl -x192.168.66.131:80 111.com -I
HTTP/1.1 403 Forbidden
Date: Sun, 01 Jul 2018 04:47:23 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

[root@localhost ~]# curl -A "www.baidu.com" -x192.168.66.131:80 111.com -I
HTTP/1.1 403 Forbidden
Date: Sun, 01 Jul 2018 04:47:43 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Content-Type: text/html; charset=iso-8859-1

[root@localhost ~]# curl -A "www.qq.com" -x192.168.66.131:80 111.com -I
HTTP/1.1 200 OK
Date: Sun, 01 Jul 2018 04:47:51 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=GBK

可以看到用curl和包含baidu.com的访问显示403,用其他显示200,OK

11.30/11.31 php相关配置

1、查看加载的php配置文件

[root@localhost ~]#  /usr/local/php/bin/php -i|grep -i "loaded configuration file"
PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0
Loaded Configuration File => /usr/local/php/etc/php.ini

说明:有时候可能显示不正确,可以用apache打开php.info()查看加载的配置文件 2、设置默认时区 可以看到上面PHP有个警告,是因为时区没有设置

[root@localhost ~]# vim /usr/local/php/etc/php.ini
搜索:date.timezone,编辑如下
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Shanghai    #设置时区为亚洲/上海,并取消前面的注释符;
[root@localhost ~]# /usr/local/php/bin/php -i|grep -i "loaded configuration file" #再次运行已经没有警告
Loaded Configuration File => /usr/local/php/etc/php.ini

3、关闭一些危险的函数

[root@localhost ~]# vim /usr/local/php/etc/php.ini
搜索:disable_functions,编辑如下
disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close

4、配置错误日志,错误显示

[root@localhost ~]# vim /usr/local/php/etc/php.ini
分别搜索:error_log, log_errors, display_errors, error_reporting,编辑如下
error_log = On                                              #先打开错误日志
log_errors = /var/log/php/php_error.log        #定义错误日志的路径
display_errors = Off                                       #关闭网页上显示的错误信息    
将error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT改为    #更改错误日志级别
error_reporting = E_ALL & ~E_NOTICE

php的常用错误日志级别

E_ERROR : 致命的运行时错误,会阻止脚本运行。
E_WARNING : 运行时警告
E_RARSE:语法解析错误
E_NOTICE: 运行时注意消息
E_ALL :全部错误
E_ALL &~E_NOTICE 除了notice之外所有的错误

5、配置open_basedir,限定网站的活动目录 目前,一台服务器上跑多个网站的情况在企业中很普遍,如果其中一个网站被黑,很可能会连累到其他网站,需要通过open_basedir功能来限制一个网站的活动目录

[root@localhost ~]# vim /usr/local/php/etc/php.ini
搜索:open_basedir,编辑如下
open_basedir = /tmp:/data/111 指定网站的活动目录,并取消前面的注释符;

php.ini是针对php的全局配置,即针对所有的虚拟主机都生效,如果只运行了一台虚拟主机可以用php.ini里的方法来限定网站的活动目录,如果运行了多台虚拟机,就需要在httpd.conf里针对每个虚拟主机分别设置 编辑httpd_vhosts.conf [root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

在每一台虚拟主机设置的最后一行</VirtualHost>上方添加对应网站的活动目录,以实现逐站限定活动目录: php_admin_value open_basedir "/data/111" php_admin_value open_basedir 是固定格式

11.32 php扩展模块安装

查看模块

[root@localhost ~]# /usr/local/php/bin/php -m 
[PHP Modules]
bz2
Core
ctype
date
dom
ereg
exif
fileinfo
此处省略。。。

下面安装一个redis的模块

[root@localhost ~]# cd /usr/local/src
[root@localhost src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop 
--2018-07-01 13:20:14--  https://codeload.github.com/phpredis/phpredis/zip/develop
正在解析主机 codeload.github.com (codeload.github.com)... 13.229.189.0, 13.250.162.133, 54.251.140.56
正在连接 codeload.github.com (codeload.github.com)|13.229.189.0|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:239183 (234K) [application/zip]
正在保存至: “develop”
100%[=============================================================>] 239,183      187KB/s 用时 1.3s   
2018-07-01 13:20:17 (187 KB/s) - 已保存 “develop” [239183/239183])
[root@localhost src]# mv develop phpredis-develop.zip
[root@localhost src]#  unzip phpredis-develop.zip
Archive:  phpredis-develop.zip
fa5f6e1411e99c809dba9cfa126952758e30f4b0
   creating: phpredis-develop/
  inflating: phpredis-develop/.gitignore  
  inflating: phpredis-develop/.gitmodules  
  inflating: phpredis-develop/.travis.yml  
  inflating: phpredis-develop/COPYING  
  inflating: phpredis-develop/CREDITS  
	。。。

进入phpredis目录

[root@localhost src] cd phpredis-develop
[root@localhost phpredis-develop] /usr/local/php/bin/phpize //生成configure文件
[root@localhost phpredis-develop] ./configure --with-php-config=/usr/local/php/bin/php-config
 [root@localhost phpredis-develop]make && make install
 [root@localhost phpredis-develop]/usr/local/php/bin/php -i |grep extension_dir //查看扩展模块存放目录,我们可以在php.ini中去自定义该路径 
[root@localhost phpredis-develop] vim /usr/local/php/etc/php.ini  //增加一行配置(可以放到文件最后一行)
extension = redis.so  

查看 动态扩展模块 grep '^extension=' /usr/local/php/etc/php.ini

[root@localhost phpredis-develop]# grep '^extension' /usr/local/php/etc/php.ini
extension = redis.so

扩展 几种限制ip的方法 http://ask.apelearn.com/question/6519 apache 自定义header http://ask.apelearn.com/question/830 apache的keepalive和keepalivetimeout http://ask.apelearn.com/question/556 apache开启压缩 http://ask.apelearn.com/question/5528 apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292 apache options参数 http://ask.apelearn.com/question/1051 apache禁止trace或track防止xss http://ask.apelearn.com/question/1045 apache 配置https 支持ssl http://ask.apelearn.com/question/1029 apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/ http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html apache rewrite 出现死循环 http://ask.apelearn.com/question/1043 php错误日志级别参考 http://ask.apelearn.com/question/6973 php开启短标签 http://ask.apelearn.com/question/120 php.ini详解 http://legolas.blog.51cto.com/2682485/493917