文档章节

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

r
 robertt15
发布于 2018/11/20 11:54
字数 1917
阅读 15
收藏 0

11月20日任务

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

11.29 限制user_agent

11.30/11.31 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 - - [...: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 - - [...: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: ..., ... 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"
  • 指定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: ..., ... 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://开头)

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
  1. 在要访问的目录下创建一个包含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服务,使配置生效

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

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 
[... 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
# 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 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

网站的某个目录下的网页被黑,设置了open_basedir将起到隔离的作用,将目标限制在某一个目录下

  1. php配置文件:针对网站下的所有目录
[root@localhost ~]# vim /usr/local/php/etc/php.ini 
...
# 定位到该行,指定路径
open_basedir = /data/wwwroot/111.com:/tmp
...
  1. 虚拟主机配置文件,限定在特定的虚拟主机下
[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/"

© 著作权归作者所有

共有 人打赏支持
r
粉丝 0
博文 67
码字总数 102282
作品 0
深圳
私信 提问
LAMP架构(访问控制之限制php解析、限制user_agent、php相关配置)

访问控制之限制php解析 一些提供用户上传的文件下有可能被不正常放入可运行的文件,所以我们要做的就是提前设置禁止解析这些目录下的可执行php或其他文件,避免损失。 编辑虚拟机配置文件 关...

蛋黄_Yolks
2018/08/08
0
0
禁止解析PHP、限制user_agent、配置PHP

禁止PHP解析 对于PHP语言编写的网站,有一些目录是要上传文件的。如果网站代码有漏洞,会让黑客上传一个PHP代码写的木马,网站执行PHP,会让黑客拿到服务器的权限,为了避免这个情况,要把能...

黄昏残影
2018/08/07
0
0
限定某个目录禁止解析php,限制user_agent, php相关配置

限定某个目录禁止解析php: 对于使用php语言编写的网站,有一些目录是有需求上传文件的。如果网站代码有漏洞,让黑客上传了一个用PHP写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服...

叶瑾
2018/04/23
0
0
限定某个目录禁止解析php,限制user_agent,php相关配置

11月20日任务 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置 1.限定某个目录禁止解析php 核心配置文件内容 <Directory /data/wwwroot/www.123.com/upload> p...

hhpuppy
2018/11/20
0
0
禁止解析PHP、限制user_agent、php相关配置

11.28 限定某个目录禁止解析php 核心配置文件内容 curl测试时直接返回了php源代码,并未解析 可以写的目录,99%不需要解析php,静态文件所存放的目录,不允许存放php。 11.29 限制user_agen...

派派菠菜
2018/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解java虚拟机-垃圾收集器与内存分配策略

垃圾收集器与内存分配策略 引用计数法 就是给对象添加一个计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1,计数器为0的对象就是不可能再被使用的。 缺点:无法...

须臾之余
41分钟前
3
0
git 忽略不必要的文件

通过 git 的 ignore 策略来忽略一些不必要的或者是敏感的文件,达到加速开发和保护隐私的效果 文件中配置: 文件夹:/vendor 文件: .env通配符: src/*.js 注意: .gitignore文件只对还没...

echojson
46分钟前
2
0
Python+Appium自动化测试环境搭建

1.Android SDK 下载SDK并配置系统环境变量ANDROID_HOME。 2.Appium 2.1 直接下载安装 官网下载安装appium-desktop-setup.exe。 2.2 通过npm下载安装 appium本质是一个nodejs库所以要先安装n...

维他ViTa
今天
3
0
MacOS安装单机版HBase

MacOS安装HBase,必然是用于测试了,从简入手、从简配置。 直接通过brew安装即可: brew install hbase 成功安装后,验证是否成功,如果不出意外的话,应该有如下输出: RippleMBP:~ userna...

RippleChan
今天
4
0
linux下oracle随操作系统启动而启动

大家一定还记得,我们在windows下安装oracle后,重起windows,数据库会自动启动,但在linux下,如果我们重起了操作系统, 就会发现数据库需要手工去输入,这个本来有好处,让dba知道操作系统已经重起...

突突突酱
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部