LAMP架构之php禁止解析、user_agent限定及php配置文件常规设置

本文索引:

  • 禁止某目录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

test.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

    <?php echo "test" ?>

对应日志记录

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配置文件的位置

  1. 命令行模式

    [root@localhost ~]# /usr/local/php/bin/php -i | grep -i "loaded configuration file"

    Loaded Configuration File => /usr/local/php/etc/php.ini

  2. 在要访问的目录下创建一个包含phpinfo()的PHP文件,然后访问该网页即可

php.ini_path

如果上述方法都无法获取到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服务,使配置生效

浏览器访问时就会得到如下的错误

fun_error

时区 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

访问页面的空白效果

fun_error

  • 设置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 //输入如下代码,该代码是错误的,日志将会记录语法错误

    <?php echo 111; test

查看是否在指定的路径生成了错误日志

[root@localhost ~]# ls -l /tmp/php_errors.log -rw-r--r--. 1 daemon daemon 399 1226 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将起到隔离的作用,将目标限制在某一个目录下

  1. php配置文件:针对网站下的所有目录

    [root@localhost ~]# vim /usr/local/php/etc/php.ini ...

    定位到该行,指定路径

    open_basedir = /data/wwwroot/111.com:/tmp ...

  2. 虚拟主机配置文件,限定在特定的虚拟主机下

    [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/"


点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Apache禁止解析PHP、禁止指定user_agent、php配置文件

Apache禁止解析PHP某个目录禁止解析PHP,是很有用的。特别是能够上传文件的目录。做网站安全的时候,这用的很多,比如某个目录可以上传文件,为了防止上传的文件有木马,所以我们禁止这个目录下面的访问解析PHP禁止解析PHP修改虚拟主机配置文件vim/usr/local/apache2/conf/ext

LAMP架构之php禁止解析、user_agent限定及php配置文件常规设置 - HelloWorld