11月20日任务php
11.28 限定某个目录禁止解析phphtml
11.29 限制user_agentshell
11.30/11.31 php相关配置apache
某些目录能够上传图片等文件,若是不设置禁止PHP解析,上传的PHP文件若是被执行可能被某些人获取到系统权限,从而形成服务器机密内容的泄露,所以设置这些目录下的PHP文件禁止解析就十分重要。vim
建立测试目录和文件浏览器
[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
查看对于的日志记录架构
192.168.65.1 - - [...: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)"
[root@localhost ~]# curl -x 192.168.65.133:80 111.com/upload/test.php <?php echo "test" ?>
对应日志记录curl
192.168.65.133 - - [...:19:15:52 +0800] "HEAD HTTP://111.com/upload/test.php HTTP/1.1" 200 - "-" "curl/7.29.0"
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> ...
[root@localhost ~]# curl -x 127.0.0.1:80 111.com/test.jpg -I HTTP/1.1 403 Forbidden Date: ..., ... 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 - - [...:19:57:19 +0800] "HEAD HTTP://111.com/test.jpg HTTP/1.1" 403 - "-" "curl/7.29.0"
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: ..., ... 12:00:47 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Last-Modified: ..., ... 13:20:20 GMT ETag: "18652-5612a0725ed00" Accept-Ranges: bytes Content-Length: 99922 Content-Type: image/jpeg
对应的日志记录
127.0.0.1 - - [...:20:00:47 +0800] "HEAD HTTP://111.com/test.jpg HTTP/1.1" 200 - "-" "test"
curl -x 省略host
curl -I 只查看状态码
curl -e 指定referer(必须http://开头)
[root@localhost ~]# /usr/local/php/bin/php -i | grep -i "loaded configuration file" Loaded Configuration File => /usr/local/php/etc/php.ini
若是上述方法都没法获取到php.ini的位置信息,那么多是系统安装时未拷贝php.ini至安装目录。
因为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服务,使配置生效
浏览器访问时就会获得以下的错误
[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 [... 13:19:34 UTC] PHP Parse error: syntax error, unexpected end of file in /data/wwwroot/111.com/test.php on line 4 # 设置后 [... 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开发环境下默认为On(开启),生产环境最好设置为Off,否则会暴露系统内部路径 # 设置了Off后,向上文中display_functions禁掉phpinfo后浏览器访问时就只显示白页 display_errors = Off
访问页面的空白效果
# 关闭了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 //输入以下代码,该代码是错误的,日志将会记录语法错误 <?php echo 111; test
查看是否在指定的路径生成了错误日志
[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: ..., ... 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 [... 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将起到隔离的做用,将目标限制在某一个目录下
[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/"