预习:11.25 配置防盗链-11.32 php扩展模块装安

预习:

11.25 配置防盗链
11.26 访问控制Directory
11.27 访问控制FilesMatch
11.28 限定某个目录禁止解析php
11.29 限制user_agent
11.30/11.31 php相关配置
11.32 php扩展模块装安

扩展
几种限制ip的方法 http://ask.apelearn.com/question/6519
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

11.25 配置防盗链

在这里插入图片描述

操作步骤:

1. 通过限制referer来实现防盗链的功能,配置文件增加如下内容:

<Directory /data/wwwroot/www.123.com>
        SetEnvIfNoCase Referer "http://www.123.com" local_ref
        SetEnvIfNoCase Referer "http://123.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref
        <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
            Order Allow,Deny
            Allow from env=local_ref
        </filesmatch>
</Directory>

2. curl -e "http://www.aminglinux.com/123.html" 自定义referer

防盗链能限制不认识的referer的访问,能够禁止别人的服务器引用或转发我服务器上的内容,这样可以防止别人盗用我服务器上的资源,服务器的资源被盗用会导致网络带宽的使用量上升。

1. 配置虚拟主机文件增加以下内容:
[root@sc ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf 
    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://aaa.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>

在这里插入图片描述

2. 修改完之后重新加载一下配置文件:
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl graceful
3. 然后使用浏览器测试一下是否能够访问:

在这里插入图片描述

4. 可以看到现在去访问图片就提示 Forbidden 了,因为我们没有把空 referer 放行所以会显示 Forbidden,空 referer 一会再介绍,如果我现在在一个第三方网站上引用这个地址,如果这个网站没有在白名单中,也是无法进行访问的:

例如:我在猿课论坛网站的帖子上把这个地址做成超链接然后去访问:
想把一个网址变成超链接,按回车就可以了,http://111.com/qq.png

在这里插入图片描述

5. 同样的也是显示 Forbidden,无法访问:

在这里插入图片描述

6. 想要能够访问的话就得把这个第三方网站的域名设置到白名单里去:
[root@sc ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
  <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://ask.apelearn.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@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl graceful
7. 这时候再点击那个超链接就可以访问了:

在这里插入图片描述

8. 至于空 referer 也是在白名单里放行就可以了,所谓空 referer 就是不是从第三方网站跳转过去访问的,而是直接使用 111.com/test.jpg 这样的一个地址去访问的就是空 referer:
[root@sc ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
  <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://ask.apelearn.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@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc ~]#
9. 放行空 referer 后,也就可以直接空 referer 访问了:

在这里插入图片描述

10. 使用 curl 命令也可以进行空 referer 的访问:
[root@sc ~]# curl -x127.0.0.1:80 111.com/qq.png -I
HTTP/1.1 200 OK
Date: Fri, 10 May 2019 03:43:57 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Last-Modified: Thu, 09 May 2019 07:54:34 GMT
ETag: "9666-5886fc2c52280"
Accept-Ranges: bytes
Content-Length: 38502
Content-Type: image/png

[root@sc ~]#
11. 也可以模拟第三方网站的访问,需要使用到 curl -e 选项:
[root@sc ~]# curl -e "http://ask.apelearn.com" -x127.0.0.1:80 111.com/qq.png -I
HTTP/1.1 200 OK
Date: Fri, 10 May 2019 03:46:36 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Last-Modified: Thu, 09 May 2019 07:54:34 GMT
ETag: "9666-5886fc2c52280"
Accept-Ranges: bytes
Content-Length: 38502
Content-Type: image/png

[root@sc ~]#
12. 同样的不在白名单里的域名去访问就会报403状态码提示Forbidden:
[root@sc ~]# curl -e "http://www.qq.com/123.txt" -x127.0.0.1:80 111.com/qq.png1 -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 03:52:35 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc ~]#
13. 查看日志也可以看到会记录 referer:
[root@sc ~]# curl -e "http://qq.com/123.txt" -x127.0.0.1:80 111.com/qq.png1 -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 04:02:09 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc ~]# tail /usr/local/apache2.4.39/logs/111.com-access_20190510.log 
127.0.0.1 - - [10/May/2019:11:50:45 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 403 - "http://qq.com" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:11:52:35 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 403 - "http://www.qq.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:11:53:26 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:11:54:20 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:11:58:47 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:11:59:16 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:12:02:09 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 403 - "http://qq.com/123.txt" "curl/7.29.0"
[root@sc ~]#

11.26 访问控制Directory

在这里插入图片描述

操作步骤:

[root@sc ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
1. 核心配置文件内容:
  
   <Directory /data/wwwroot/www.123.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
   </Directory>

2. curl测试状态码为403则被限制访问了

访问控制类似于用户认证,但是要比用户认证更安全一些,因为用户认证需要输入账户密码,如果账户密码被别人知道了,那么别人就能够通过认证去访问你的服务器了。

访问控制则不需要通过账户密码来验证,因为访问控制只允许白名单内的IP进行访问,其他的IP一概拒绝访,所以在安全性上要比用户认证的机制更安全一些,而且这两者也可以结合到一起使用:先通过用户认证再让访问控制去过滤IP也是可以的。

1. 修改虚拟主机配置文件内容如下:
[root@sc admin]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
  <Directory /data/wwwroot/111.com/admin/>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
  </Directory>

在这里插入图片描述

[root@sc admin]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc admin]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc admin]#
2. 保存修改后,到 /data/wwwroot/111.com 目录下创建一个 admin 目录,并拷贝 index.php 文件到 admin 目录下:在这里插入图片描述
3. 然后加载配置文件后,使用 curl 命令进行测试,可以看到使用白名单里的IP是可以进行访问的:
[root@sc admin]# curl -x127.0.0.1:80 111.com/admin/index.php -I
HTTP/1.1 200 OK
Date: Fri, 10 May 2019 06:31:59 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
X-Powered-By: PHP/5.6.39
Content-Type: text/html; charset=UTF-8

[root@sc admin]# curl -x127.0.0.1:80 111.com/admin/index.php     
121212
[root@sc admin]#
4. 如果我换一个不在白名单里的 IP 去进行访问,就会出现 403 状态码:
[root@sc admin]# curl -x127.0.0.1:80 111.com/admin/index.php
121212
[root@sc admin]# curl -x192.168.85.130:80 111.com/admin/index.php -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 06:36:56 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc admin]#
5. 查看日志内容也可以看到记录了这两个访问:
[root@sc admin]# tail /usr/local/apache2.4.39/logs/111.com-access_20190510.log 
127.0.0.1 - - [10/May/2019:11:58:47 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:11:59:16 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 404 - "http://111.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:12:02:09 +0800] "HEAD HTTP://111.com/qq.png1 HTTP/1.1" 403 - "http://qq.com/123.txt" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:14:31:59 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:14:32:13 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 7 "-" "curl/7.29.0"
192.168.85.130 - - [10/May/2019:14:34:47 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 403 224 "-" "curl/7.29.0"
192.168.85.130 - - [10/May/2019:14:35:26 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
192.168.85.130 - - [10/May/2019:14:36:23 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:14:36:29 +0800] "GET HTTP://111.com/admin/index.php HTTP/1.1" 200 7 "-" "curl/7.29.0"
192.168.85.130 - - [10/May/2019:14:36:56 +0800] "HEAD HTTP://111.com/admin/index.php HTTP/1.1" 403 - "-" "curl/7.29.0"
[root@sc admin]#
6. 同样的使用浏览器去访问也是 Forbidden:

在这里插入图片描述

11.27 访问控制FilesMatch

在这里插入图片描述

操作步骤:

1. 核心配置文件内容:

<Directory /data/wwwroot/www.123.com>
    <FilesMatch  admin.php(.*)>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </FilesMatch>
</Directory>

除了 Directory 的访问控制还有 FilesMatch 的访问控制,Directory 访问控制类似于限制一个目录的访问,而 FilesMatch 访问控制则类似于限制一个文件或文件链接的访问,FilesMatch 要写在 Directory 之内。

1. 修改虚拟主机配置文件内容如下:
[root@sc admin]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
    <Directory /data/wwwroot/111.com/admin/>
        <FilesMatch  admin.php(.*)>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        </FilesMatch>
    </Directory>

在这里插入图片描述

[root@sc admin]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc admin]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc admin]#
2. 修改完成后重新加载配置文件,然后使用 curl 命令访问 admin.php 或与此文件的相关链接,就都会报 403 状态码:
[root@sc admin]# curl -x192.168.85.130:80 'http://111.com/admin/admin.php?xxx' -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 08:52:14 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc admin]#
3. 使用白名单内的IP去访问就不会报 403 了,报 404 的原因是因为没有这个文件,但是已经可以访问了:
[root@sc admin]# curl -x127.0.0.1:80 'http://111.com/admin/admin.php?xxx' -I
HTTP/1.1 404 Not Found
Date: Fri, 10 May 2019 09:12:19 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc admin]#

控制 FilesMatch 相对于控制 Directory 来说要灵活一些,因为 Directory 是控制整个目录,控制 FilesMatch 则能针对一些具体的文件去进行控制,要更细化一些,对一些具体的访问控制,就适合控制 FilesMatch 。

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

在这里插入图片描述

操作步骤:

1. 核心配置文件内容:

    <Directory /data/wwwroot/www.123.com/upload>
        php_admin_flag engine off
    </Directory>

2. curl 测试时直接返回了 php 源代码,并未解析

如果我们的网站有一个目录,可以上传图片,可能保不准有些别有用心的人会通过一些手段,上传php文件到这个目录下。那么这个php文件就会被apache执行,如果这个php文件里写的是恶意代码,你的服务器自然就会遭到攻击。毕竟开放了这样一个权限,肯定会被人上传木马文件,如果被夺取了你的服务器root权限就很危险了。

1. 首先配置虚拟主机配置文件,加上以下内容:
[root@sc 111.com]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
    <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off
        <FilesMatch (.*)\.php(.*)>
        Order allow,deny
        Deny from all
        </FilesMatch>
    </Directory>

在这里插入图片描述

[root@sc 111.com]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc 111.com]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc 111.com]#
2. 修改完成并重新加载配置文件后,先创建一个目录,然后拷贝一个 php 文件过去:

在这里插入图片描述

3. 接下来就可以进行测试了,状态码为 403 就没问题:
[root@sc 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 12:13:05 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc 111.com]#
4. 浏览器就会先显示 Forbidden:

在这里插入图片描述

5. 现在把 FilesMatch 那一行注释掉,看看是否会看到 php 文件的源代码:
[root@sc 111.com]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
    <Directory /data/wwwroot/111.com/upload>
        php_admin_flag engine off
        #<FilesMatch (.*)\.php(.*)>
        #Order allow,deny
        #Deny from all
        #</FilesMatch>
    </Directory>

在这里插入图片描述

[root@sc 111.com]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc 111.com]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc 111.com]#
6. 可以看到直接显示了我源代码,并没有进行解析。
[root@sc 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php'   
<?php
echo "123.php";
?>
[root@sc 111.com]#
7. 如果是在浏览器中访问的话,就会直接下载了,因为无法解析:

在这里插入图片描述

常识:在服务器中存放静态文件的目录,99%是不允许存放php等文件的,所以不用担心禁止解析的问题。

11.29 限制user_agent

在这里插入图片描述

操作步骤:

user_agent可以理解为浏览器标识,核心配置文件内容:

   <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F]
    </IfModule>

curl -A "123123" 指定user_agent

访问控制-user_agent的需求背景:比如说我们的网站,有可能会受到CC攻击,CC攻击的大概原理就是攻击的人,他通过一些手段,例如他通过发动肉鸡的方式,使用几千或上万台肉鸡同时访问一个网站。那么这个网站就会同时有几千上万个请求,一般普通的网站是承受不了这么大的并发量的,所以这个网站就会很容易就崩掉,这就是所谓的CC攻击。这种CC攻击是有一定的规律的,例如它们的-user_agent就是一致的,所以我们也可以以此来判定这是CC攻击。遇到这种-user_agent很规律或完全一致的请求,我们就可以通过限制-user_agent,来减轻服务器的压力。

1. 要禁止 php 解析,首先配置虚拟主机配置文件,加上以下内容:
[root@sc ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F]
    </IfModule>

在这里插入图片描述

[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]#  /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc ~]#
2. 修改完成并重新加载配置文件后,就可以进行测试了,先用 curl 命令访问,状态码为 403 就没问题:
[root@sc ~]# curl -x127.0.0.1:80 'http://111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 14:04:09 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc ~]# curl -x127.0.0.1:80 'http://111.com/123.php' -I
HTTP/1.1 403 Forbidden
Date: Fri, 10 May 2019 14:04:24 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
Content-Type: text/html; charset=iso-8859-1

[root@sc ~]#
3. 自定义 -user_agent 后再试一下,使用 -A 选项模拟 -user_agent ,状态码为 200 就没问题,因为配置文件里的限制条件里只限制了 curl 和 baidu.com
[root@sc ~]# curl -A "aminglinux aminglinux" -x127.0.0.1:80 'http://111.com/123.php' -I
HTTP/1.1 200 OK
Date: Fri, 10 May 2019 14:08:26 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
X-Powered-By: PHP/5.6.39
Content-Type: text/html; charset=UTF-8

[root@sc ~]#
4. 这时查看日志文件也可以查看到 -user_agent 的确是我们自定义的名称,所以仅仅只会匹配限制条件里定义的 -user_agent :
[root@sc ~]# tail /usr/local/apache2.4.39/logs/111.com-access_20190510.log 
127.0.0.1 - - [10/May/2019:20:19:10 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:20:19:26 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:20:19:48 +0800] "GET http://111.com/upload/123.php HTTP/1.1" 200 25 "-" "curl/7.29.0"
192.168.85.1 - - [10/May/2019:20:21:19 +0800] "GET /upload/123.php HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"
192.168.85.1 - - [10/May/2019:20:24:17 +0800] "GET /upload/123.php HTTP/1.1" 403 223 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0"
127.0.0.1 - - [10/May/2019:22:03:55 +0800] "GET http://111.com/upload/123.php HTTP/1.1" 403 223 "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:22:04:09 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:22:04:24 +0800] "HEAD http://111.com/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [10/May/2019:22:08:08 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 403 - "-" "aminglinux aminglinux"
127.0.0.1 - - [10/May/2019:22:08:26 +0800] "HEAD http://111.com/123.php HTTP/1.1" 200 - "-" "aminglinux aminglinux"
[root@sc ~]#

11.30/11.31 php相关配置

在这里插入图片描述

操作步骤模板:

查看php配置文件位置:

1. /usr/local/php/bin/php -i|grep -i "loaded configuration file"
2. date.timezone
3. disable_functions

这条没加phpinfo:
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

这条加了phpinfo:
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,phpinfo

4. error_log, log_errors, display_errors, error_reporting
5. open_basedir
6. php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"

关于php配置文件位置的问题,这里要注意一点:有时候使用-i选项去找这个配置文件的话,可能找到的是与你浏览器上网站所使用的php.ini不是同一个,想要精确一点去找这个配置文件最好使用phpinfo去找。

操作步骤示例:

1. 例如 111.com,我想找到这个网站所使用的 php.ini 文件在哪里,那就要在这个 111.com 的网站目录下创建一个 phpinfo 的页面。然后通过浏览器去访问,就可以看到这个 php.ini 文件在哪,创建一个 php 文件:

在这里插入图片描述

  1. 文件内容如下:
<?php
phpinfo();
?>

在这里插入图片描述

2. 使用浏览器访问这个页面:

在这里插入图片描述

  1. 如果没有加载,得去 php 的源码包里拷贝一份这个配置文件,我之前选的是php-5.6.39,拷贝完之后还要重新加载 Apache 的配置文件:
[root@sc 111.com]# vi index.php 
[root@sc 111.com]# cd /usr/local/src/php-5.6.39/
[root@sc php-5.6.39]# cp php.ini-production /usr/local/php/etc/php.ini
[root@sc php-5.6.39]#  /usr/local/apache2.4.39/bin/apachectl graceful
3. 现在我们就可以打开 php.ini 文件进行一些配置了:
[root@sc php-5.6.39]# vim /usr/local/php/etc/php.ini

1.配置 disable_functions,可以禁止某些危险函数的解析。比如一句话木马就用到了其中的 eval 函数,代码示例:

在这里插入图片描述

  1. 禁用掉eval函数的话,这种木马就无法被解析了,列举一些比较危险的函数:
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
  1. 配置disable_functions,这个属性默认是空的:

在这里插入图片描述

  1. 现在我们把刚刚列举的那些危险的函数都配置进去,把它们都给禁掉:

在这里插入图片描述

  1. 在大多数的公司会在生产环境中把phpinfo给禁掉,因为怕有时候不小心将phpinfo页面上传到了线上去了。如果这个页面被外部的黑客访问到的话,就能看到你服务器上的一些目录。那么黑客获取到了这些信息后,就可以更容易的进行渗透,所以为了安全起见也要把 phpinfo 给禁止掉:
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,phpinfo

在这里插入图片描述

[root@sc php-5.6.39]#  /usr/local/apache2.4.39/bin/apachectl graceful
  1. 禁止phpinfo后,测试一下看看能不能解析,显示如下内容就是这个函数已经被禁止解析了:

在这里插入图片描述

  1. 去掉phpinfo恢复之前:
[root@sc php-5.6.39]# vim /usr/local/php/etc/php.ini 
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
[root@sc php-5.6.39]#  /usr/local/apache2.4.39/bin/apachectl graceful
4. date.timezone 的配置,配置date.timezone 就是定义一下时区,不然有时候会有一些警告信息,例如我定义时区为上海:
date.timezone = Asia/Shanghai

在这里插入图片描述

5. 日志相关的配置:

error_log, log_errors, display_errors, error_reporting

如果没有配置日志就会像刚才那样直接显示在浏览器上。

display_errors属性是用于定义是否显示日志信息在在浏览器上:

直接显示在浏览器上会暴露目录,所以要把这个值改为Off:

这时候再访问就不会显示日志信息了:

[root@sc php-5.6.39]# vim /usr/local/php/etc/php.ini 

在这里插入图片描述

[root@sc php-5.6.39]#  /usr/local/apache2.4.39/bin/apachectl graceful

在这里插入图片描述

[root@sc php-5.6.39]# curl -A "a" -x127.0.0.1:80 http://111.com/index.php -I
HTTP/1.1 200 OK
Date: Fri, 10 May 2019 15:52:48 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
X-Powered-By: PHP/5.6.39
Content-Type: text/html; charset=UTF-8

[root@sc php-5.6.39]#
6. 然后就是配置错误日志:
  1. log_errors属性用于定义错误日志是否开启:

在这里插入图片描述

  1. error_log属性用于定义错误日志的存放路径:

在这里插入图片描述

  1. error_reporting属性是用于定义error_log的级别,如果定义的级别比较高的话,就只会记录比较严重的错误,警告之类的就不会记录。error_reporting属性默认为E_ALL级别,E_ALL就是把所有的错误都记录,级别比较低。在生产环境中,一般使用E_ALL & ~E_NOTICE级别。

在这里插入图片描述

[root@sc php-5.6.39]# /usr/local/apache2.4.39/bin/apachectl -t       
Syntax OK
[root@sc php-5.6.39]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc php-5.6.39]#
7. 配置完成后,重新加载Apache的配置文件,然后测试一下看看在tmp下是否会生成错误日志:

在这里插入图片描述

8. 可以看到这个文件的属主和属组都是daemon:
[root@sc php-5.6.39]# ls -l /tmp/php_errors.log 
-rw-r--r--. 1 daemon daemon 270 May 11 00:04 /tmp/php_errors.log
[root@sc php-5.6.39]#
9. daemon是httpd的属组,所以这个日志实际上是以http这个进程的身份生成的:在这里插入图片描述
10. 有时候这个日志定了路径却没有生成的话,就得查看一下是否是权限的问题,也可以自己事先在定义的路径下创建好日志文件,并定义权限为777。
  1. 再来模拟一个错误,创建一个php文件:
[root@sc php-5.6.39]# vim /data/wwwroot/111.com/2.php

在这里插入图片描述

  1. 访问这个文件的话,状态码就会为500:
[root@sc php-5.6.39]# curl -A "a" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Fri, 10 May 2019 16:15:35 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
X-Powered-By: PHP/5.6.39
Connection: close
Content-Type: text/html; charset=UTF-8

[root@sc php-5.6.39]#
  1. 查看错误日志可以看到这个错误为error:

在这里插入图片描述

11. open_basedir是一个安全选项,如果你一台服务器上跑了n多个站点,保不准某个站点的代码有问题写得比较差漏洞比较多,所以如果这个站点被黑了,被人拿到了权限后继续渗透的话,可能会渗透到其他的站点,和俗话说的一颗老鼠屎坏了一锅粥的道理一样。但是这时候如果增加了open_basedir的话,那么就可以能黑不了其他网站,例如:A网站放在A目录下,B网站放在B目录下,然后给这两个目录做一个隔离,所以即使A目录被黑了,也黑不到B目录下,因为无法查看到B目录。
  1. 配置 php.ini 文件:
open_basedir = /data/wwwroot/111.com:/tmp

在这里插入图片描述

  1. 我现在故意把目录写成 1111.com,模拟一下这种情况:

在这里插入图片描述

[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc ~]#
  1. 把 2.php 的内容改正以后:
[root@sc ~]# vi /data/wwwroot/111.com/2.php 

在这里插入图片描述

12. 这时使用 curl 命令去访问还是会出现 500 状态码:
[root@sc ~]# curl -A "aminglinux aminglinux" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.0 500 Internal Server Error
Date: Sat, 11 May 2019 09:35:41 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
X-Powered-By: PHP/5.6.39
Connection: close
Content-Type: text/html; charset=UTF-8

[root@sc ~]#
13. 查看日志文件可以知道,访问的文件并没有在允许的目录下:
[root@sc ~]# cat /tmp/php_errors.log 
[10-May-2019 16:04:31 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[10-May-2019 16:04:49 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[10-May-2019 16:15:20 UTC] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[10-May-2019 16:15:35 UTC] PHP Parse error:  syntax error, unexpected end of file in /data/wwwroot/111.com/2.php on line 4
[11-May-2019 09:00:33 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[11-May-2019 09:00:33 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[11-May-2019 09:00:50 UTC] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[11-May-2019 09:35:36 UTC] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[11-May-2019 09:35:36 UTC] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[11-May-2019 09:35:36 UTC] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php/lib/php') in Unknown on line 0
[11-May-2019 09:35:41 UTC] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/111.com/2.php) is not within the allowed path(s): (/data/wwwroot/1111.com:/tmp) in Unknown on line 0
[11-May-2019 09:35:41 UTC] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0
[11-May-2019 09:35:41 UTC] PHP Fatal error:  Unknown: Failed opening required '/data/wwwroot/111.com/2.php' (include_path='.:/usr/local/php/lib/php') in Unknown on line 0
[root@sc ~]#
14. 现在把 open_basedir 改为 111.com,再测试一下,这时就正常了:
[root@sc ~]# vim /usr/local/php/etc/php.ini

在这里插入图片描述

[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc ~]# curl -A "aminglinux aminglinux" -x127.0.0.1:80 http://111.com/2.php -I
HTTP/1.1 200 OK
Date: Sat, 11 May 2019 09:43:22 GMT
Server: Apache/2.4.39 (Unix) PHP/5.6.39
X-Powered-By: PHP/5.6.39
Content-Type: text/html; charset=UTF-8

[root@sc ~]#
15. 但是配置 php.ini 的 open_basedir 并没有意义,因为这样的配置只能是配置全部站点的,因为所有的站点都放在一个目录下,不能针对单个站点去做,所以和没有配置没差别,例如只能这样配置,但是没有意义:

在这里插入图片描述

16. 想要针对单个站点去配置 open_basedir 的话,需要在 apache 的虚拟主机配置文件里面去配置,配置的语法如下:

我们可以在这个文件里针对不同的虚拟主机,配置不同的open_basedir。

[root@sc ~]# vim /usr/local/apache2.4.39/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"
    ServerName abc.com
    ServerAlias www.abc.com www.123.com
    php_admin_value open_basedir "/data/wwwroot/abc.com:/tmp/"
    ErrorLog "logs/abc.com-error_log"
    CustomLog "logs/abc.com-access_log" common
</VirtualHost>

在这里插入图片描述

[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl -t
Syntax OK
[root@sc ~]# /usr/local/apache2.4.39/bin/apachectl graceful
[root@sc ~]#
[root@sc ~]# curl -A "aminglinux aminglinux" -x127.0.0.1:80 http://111.com/2.php   
123[root@sc ~]#

11.32 php扩展模块装安

在这里插入图片描述

操作步骤模板:

1. /usr/local/php/bin/php -m //查看模块

下面安装一个redis的模块:

2. cd /usr/local/src/
3. wget https://codeload.github.com/phpredis/phpredis/zip/develop
4. mv develop phpredis-develop.zip
5. unzip phpredis-develop.zip
6. cd phpredis-develop
7. /usr/local/php/bin/phpize //生成configure文件
8. ./configure --with-php-config=/usr/local/php/bin/php-config
9. make && make install
10. /usr/local/php/bin/php -i |grep extension_dir //查看扩展模块存放目录,我们可以在php.ini中去自定义该路径
11. vim /usr/local/php/etc/php.ini  //增加一行配置(可以放到文件最后一行)
12. extension = redis.so 

当有业务需求要用到php在编译安装时没有安装的模块,可以使用动态扩展的方式来安装所需要的模块。

现在介绍一下redis的安装,redis是一个nosql,在LAMP架构下一般把它当做缓存来使用。

操作步骤示例:

1. 首先使用wget命令把源码包下载到 /usr/local/src/ 目录下:

下载地址:wget https://codeload.github.com/phpredis/phpredis/zip/develop

[root@sc src]# du -sh develop 
252K	develop
[root@sc src]#
  1. 修改一下包名,并且解压:
[root@sc src]# mv develop phpredis-develop.zip
[root@sc src]# unzip phpredis-develop.zip
  1. 进入解压后的目录,并且生成 configure 文件,因为这个目录里是没有 configure 文件的:
[root@sc src]# cd phpredis-develop/
[root@sc phpredis-develop]# /usr/local/php/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
  1. 这句话出现,显示出现问题了:
    Cannot find autoconf. Please check your autoconf installation and the
    $PHP_AUTOCONF environment variable. Then, rerun this script.
  1. 下面是解决办法:
第一步:

[root@sc src]# wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
[root@sc src]# tar -zvxf m4-1.4.9.tar.gz
[root@sc src]# cd m4-1.4.9/
[root@sc src]# ./configure && make && make install
[root@sc m4-1.4.9]# echo $?
0
[root@sc m4-1.4.9]#
第二步:

[root@sc src]# cd ../
[root@sc src]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
[root@sc src]# tar -zvxf autoconf-2.62.tar.gz
[root@sc src]# cd autoconf-2.62/
[root@sc src]# ./configure && make && make install
[root@sc autoconf-2.62]# echo $?
0
[root@sc autoconf-2.62]#

然后再重新执行上一篇的方法即可。
第三步:

[root@sc src]# cd phpredis-develop/
[root@sc phpredis-develop]# /usr/local/php/bin/phpize 
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
  1. ls 一下可以看到生成的 configure 文件,如果没有生成的话可能是少了 autoconf 这个包,可以用 yum 安装一下:

在这里插入图片描述

2. 生成了 configure 文件,就可以配置编译环境了:

./configure --with-php-config=/usr/local/php7/bin/php-config

[root@sc phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@sc phpredis-develop]# echo $?
0
[root@sc phpredis-develop]#
3. 然后 make && make install 编译安装:
[root@sc phpredis-develop]# make && make install
[root@sc phpredis-develop]# echo $?
0
[root@sc phpredis-develop]#
4. ls 一下末尾提示的安装路径,确保有 .so 文件的存在:
[root@sc phpredis-develop]# [root@sc phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20180731/

在这里插入图片描述

5. 我们使用以下命令可以得知,现在php还没有支持这个模块:
[root@sc phpredis-develop]# /usr/local/php/bin/php -m |grep redis
[root@sc phpredis-develop]#

所以现在得配置php支持这个redis模块:

  1. 先查看扩展模块的目录路径:
    从结果可以得知 extension_dir 定义的路径,这个 extension_dir 是可以自定义路径的,不过一般不会去定义它,安装的扩展模块会默认放在个目录下。
[root@sc phpredis-develop]# /usr/local/php/bin/php -i |grep extension_dir

在这里插入图片描述

  1. 编辑配置文件:
[root@sc phpredis-develop]# vi /usr/local/php7/etc/php.ini
extension=redis.so

在这里插入图片描述

  1. 修改完之后查看一下是否加载了,如图就是已经加载了这个模块:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值