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

Stella981
• 阅读 791

本文索引:

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

LAMP架构之php禁止解析、user_agent限定及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配置文件的位置

  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文件,然后访问该网页即可

LAMP架构之php禁止解析、user_agent限定及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服务,使配置生效

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

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

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

访问页面的空白效果

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

  • 设置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将起到隔离的作用,将目标限制在某一个目录下

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


点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Apache禁止解析PHP、禁止指定user_agent、php配置文件
Apache禁止解析PHP某个目录禁止解析PHP,是很有用的。特别是能够上传文件的目录。做网站安全的时候,这用的很多,比如某个目录可以上传文件,为了防止上传的文件有木马,所以我们禁止这个目录下面的访问解析PHP禁止解析PHP修改虚拟主机配置文件vim/usr/local/apache2/conf/ext
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这