本文索引:
- 禁止某目录PHP解析
- 限制user_agent
- PHP相关配置
- 查看PHP配置文件的位置
- 安全函数设定
- 设置时区
- 错误信息日志
- 安全相关的参数
禁止某目录PHP解析
某些目录可以上传图片等文件,如果不设置禁止PHP解析,上传的PHP文件如果被执行可能被某些人获取到系统权限,从而造成服务器机密内容的泄露,因此设置这些目录下的PHP文件禁止解析就十分重要。
创建测试目录和文件
[root@localhost ~]# mkdir /data/wwwroot/111.com/upload
[root@localhost ~]# vim /data/wwwroot/111.com/upload/test.php
[root@localhost ~]# cat !$
cat /data/wwwroot/111.com/upload/test.php
<?php
echo "test";
?>
设置php禁止解析
[root@localhost ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
# 在虚拟主机内添加下列代码禁止解析PHP
<Directory /data/wwwroot/www.111.com/upload>
php_admin_flag engine off
</Directory>
重启apache服务
[root@localhost ~]# /usr/local/apache/bin/apachectl -t
Syntax OK
[root@localhost ~]# /usr/local/apache/bin/apachectl graceful
效果验证
- 在浏览中输入直接路径:111.com/upload/test.php,提示下载test.php,不解析php
查看对于的日志记录
192.168.65.1 - - [26/Dec/2017:19:14:51 +0800] "GET /upload/test.php HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 OPR/49.0.2725.64 (Edition Baidu)"
curl测试时会直接返回php源代码,不会解析php
[root@localhost ~]# curl -x 192.168.65.133:80 111.com/upload/test.php
对应日志记录
192.168.65.133 - - [26/Dec/2017:19:15:52 +0800] "HEAD HTTP://111.com/upload/test.php HTTP/1.1" 200 - "-" "curl/7.29.0"
限制user_agent
user_agent可以理解为浏览器标识;
CC攻击:黑客利用大量被控制的计算机(肉鸡)来在同一时间对某个网站进行访问,导致该网站访问量超出负荷,让正常用户无法访问。访问日志中共同的特点是同一时间大量相同的访问网址和user_agent。
代码配置
由于使用了mod_rewrite模块,因此必须打开主配置文件内的rewrite模块
# 查看是否已经开启,未开启需要将开头的#注释删除
[root@localhost ~]# cat /usr/local/apache/conf/httpd.conf | grep -i rewrite
LoadModule rewrite_module modules/mod_rewrite.so
修改虚拟主机配置文件,添加如下代码
[root@localhost ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
...
<IfModule mod_rewrite.c>
RewriteEngine on
# 接下设置匹配条件
# OR连接上下2个条件RewriteCond;
# NC表示忽略大小写
RewriteCond %{HTTP_USER_AGENT} .*curl.*[NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
# 配置匹配后的规则,F表示Forbidden
RewriteRule .* - [F]
</IfModule>
...
效果验证
不指定user_agent,无法访问403
[root@localhost ~]# curl -x 127.0.0.1:80 111.com/test.jpg -I HTTP/1.1 403 Forbidden Date: Tue, 26 Dec 2017 11:57:19 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Content-Type: text/html; charset=iso-8859-1
对应日志记录
127.0.0.1 - - [26/Dec/2017:19:57:19 +0800] "HEAD HTTP://111.com/test.jpg HTTP/1.1" 403 - "-" "curl/7.29.0"
指定user_agent 使用
curl -A
来指定user_agent,成功访问[root@localhost ~]# curl -A "test" -x 127.0.0.1:80 111.com/test.jpg -I HTTP/1.1 200 OK Date: Tue, 26 Dec 2017 12:00:47 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Last-Modified: Mon, 25 Dec 2017 13:20:20 GMT ETag: "18652-5612a0725ed00" Accept-Ranges: bytes Content-Length: 99922 Content-Type: image/jpeg
对应的日志记录
127.0.0.1 - - [26/Dec/2017:20:00:47 +0800] "HEAD HTTP://111.com/test.jpg HTTP/1.1" 200 - "-" "test"
curl -x 省略host
curl -I 只查看状态码
curl -e 指定referer(必须http://开头)
PHP相关配置
查看PHP配置文件的位置
命令行模式
[root@localhost ~]# /usr/local/php/bin/php -i | grep -i "loaded configuration file"
Loaded Configuration File => /usr/local/php/etc/php.ini
在要访问的目录下创建一个包含phpinfo()的PHP文件,然后访问该网页即可
如果上述方法都无法获取到php.ini的位置信息,那么可能是系统安装时未拷贝php.ini至安装目录。
安全函数设定 disable_functions
由于phpinfo会显示出服务器内LAMP架构内的很多软件的配置文件等重要文件的信息,所以在生产环境下最好禁掉,防止被黑客获取到系统内部php信息,造成损失。测试环境可以不禁。
配置如下:
[root@localhost ~]# vim /usr/local/php/etc/php.ini
# 我们可以禁止php语言内的一部分功能函数解析,这些函数易被黑客用作获取本机信息的工具
# 方法:定位到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,phpinfo
...
保存php配置文件后重启apache服务,使配置生效
浏览器访问时就会得到如下的错误
时区 date.timezone
[root@localhost ~]# vim /usr/local/php/etc/php.ini
# 定位到date.timezone行,删除开头的注释符,并在后面添加如下代码
date.timezone = Asia/Shanghai
...
保存后重启apache服务生效配置
设置时区前后日志记录时间的变化
# 设置前
[root@localhost ~]# tail -n 2 /tmp/php_errors.log
[26-Dec-2017 13:19:34 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4
# 设置后
[26-Dec-2017 21:22:01 Asia/Shanghai] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4
显示错误信息
配置display_errors
display_errors开发环境下默认为On(开启),生产环境最好设置为Off,不然会暴露系统内部路径
设置了Off后,向上文中display_functions禁掉phpinfo后浏览器访问时就只显示白页
display_errors = Off
访问页面的空白效果
设置log_errors和error_log
关闭了display_errors后需要设置log_errors和error_log用来记录错误日志
log_errors = on error_log = /tmp/php_error.log #取消注释,并设置路径
定义定义日志的级别
# 开发版默认的是E_ALL,这是最低级的,所有级别的错误信息都会被记录,这里使用的是第二个值:E_ALL & ~E_NOTICE
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E NOTICE
如果计划定义的日志始终未生成,可能是因为httpd进程用户对该目录没有w权限。为了保险起见,可以先创建日志文件,并赋予777权限。
测试效果
[root@localhost ~]# vim /data/wwwroot/111.com/test.php //输入如下代码,该代码是错误的,日志将会记录语法错误
查看是否在指定的路径生成了错误日志
[root@localhost ~]# ls -l /tmp/php_errors.log
-rw-r--r--. 1 daemon daemon 399 12月 26 20:54 /tmp/php_errors.log
使用curl命令进行测试(浏览器无法处理错误的PHP文件)
# curl命令返回的状态码为500
[root@localhost ~]# curl -A "test" -x127.0.0.1:80 http://111.com/test.php -I
HTTP/1.0 500 Internal Server Error
Date: Tue, 26 Dec 2017 13:18:25 GMT
Server: Apache/2.4.28 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Connection: close
Content-Type: text/html; charset=UTF-8
对应错误日志记录
[root@localhost ~]# tail -n 1 /tmp/php_errors.log
[26-Dec-2017 21:32:01 Asia/Shanghai]PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4
安全相关的参数 open_basedir
网站的某个目录下的网页被黑,设置了open_basedir将起到隔离的作用,将目标限制在某一个目录下
php配置文件:针对网站下的所有目录
[root@localhost ~]# vim /usr/local/php/etc/php.ini ...
定位到该行,指定路径
open_basedir = /data/wwwroot/111.com:/tmp ...
虚拟主机配置文件,限定在特定的虚拟主机下
[root@localhost ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
可以针对不同的虚拟主机限制不同的open_basedir
在某个虚拟主机下设置
php_admin_value可以配置php.ini内的配置:如error_log等
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"