设为首页 收藏本站
查看: 1969|回复: 0

[经验分享] linux的apache2.4限定某个目录禁止解析PHP及user_agent与PHP相关配置

[复制链接]

尚未签到

发表于 2018-12-12 13:32:07 | 显示全部楼层 |阅读模式
限定某个目录禁止解析PHP

  对于使用PHP语言编写的网站,有一些目录是有需求上传文件的,比如服务器可以上传图片,并且没有做防盗链,所以就会被人家当成了一个图片存储服务器,并且盗用带宽流量。如果网站代码有漏洞,让***上传了一个用PHP代码写的***,由于网站可以执行PHP程序,最终会让***拿到服务器权限,为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码(不用担心会影响网站访问,若这种目录也需要解析PHP,那说明程序员不合格)


1. 修改虚拟主机配置文件

[root@gary-tao ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
核心配置文件内容:

php_admin_flag engine off  //这一段就可以禁止解析PHP代码
//这一段就是让php的文件访问受到限制,防止php文件的源代码被查看
Order allow,deny
Deny from all


[root@gary-tao 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK  //测试语法
[root@gary-tao 111.com]# /usr/local/apache2.4/bin/apachectl graceful  //加载配置
[root@gary-tao 111.com]# mkdir upload //创建一个upload目录
[root@gary-tao 111.com]# ls
123.php  admin  index.php  qq.png  upload
[root@gary-tao 111.com]# cp 123.php upload/  

修改后示例图
DSC0000.png


2. 使用curl测试时返回403

[root@gary-tao 111.com]# curl -x172.16.111.100:80 'http://111.com/upload/123.php' -I  //直接不给访问权限
HTTP/1.1 403 Forbidden
Date: Tue, 26 Dec 2017 06:19:17 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

  测试需要把下面配置先禁止掉:

         
Order allow,deny
Deny from all

[root@gary-tao 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@gary-tao 111.com]# /usr/local/apache2.4/bin/apachectl graceful
修改后示例图:
DSC0001.png

  禁止掉后使用curl后的测试结果:

[root@gary-tao 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php'       //下例信息说明123.php不能正常解析

限制user_agent

  user_agent可以理解为浏览器标识,针对user_agent来限制一些访问,比如可以限制一些不太友好的搜索引擎“爬虫”,你之所以能在百度搜到一些论坛,就是因为百度会派一些“蜘蛛爬虫”过来抓取网站数据。“蜘蛛爬虫”抓取数据类似于用户用浏览器访问网站,当“蜘蛛爬虫”太多或者访问太频繁,就会浪费服务器资源。另外,也可以限制恶意请求,这种恶意请求我们通常称作cc***,他的原理很简单,就是用很多用户的电脑同时访问同一个站点,当访问量或者频率达到一定层次,会耗尽服务器资源,从而使之不能正常提供服务。这种cc***其实有很明显的规律,其中这些恶意请求的user_agent相同或者相似,那我们就可以通过限制user_agent发挥防***的作用。


1. 针对user_agent来做访问限制的核心配置文件内容

[root@gary-tao 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
核心配置文件内容

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR] //OR是或者的意思,user_agent匹配curl或者匹配baidu.com
RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC] //NC是忽略大小写
RewriteRule  .*  -  [F]  //F是Forbidden

[root@gary-tao 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@gary-tao 111.com]# /usr/local/apache2.4/bin/apachectl graceful
修改配置示例如下图:
DSC0002.png


2.使用curl测试如下:

[root@gary-tao 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php'


403 Forbidden

Forbidden
You don't have permission to access /upload/123.php
on this server.


[root@gary-tao 111.com]# curl -x127.0.0.1:80 'http://111.com/upload/123.php' -I
HTTP/1.1 403 Forbidden
Date: Tue, 26 Dec 2017 07:03:42 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Content-Type: text/html; charset=iso-8859-1

3.指定user_agent,如果不指定user_agent,那么curl作为user_agent会被限制访问,从上面测试可以看出。
  示例如下:

[root@gary-tao 111.com]# curl -A "xietao xietao" -x127.0.0.1:80 'http://111.com/upload/123.php' -I
HTTP/1.1 200 OK
Date: Tue, 26 Dec 2017 07:08:20 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
Last-Modified: Tue, 26 Dec 2017 06:16:53 GMT
ETag: "19-561383aa99f09"
Accept-Ranges: bytes
Content-Length: 25
Cache-Control: max-age=0
Expires: Tue, 26 Dec 2017 07:08:20 GMT
Content-Type: application/x-httpd-php
[root@gary-tao 111.com]# tail /usr/local/apache2.4/logs/111.com-access_20171226.log  //查看日志
127.0.0.1 - - [26/Dec/2017:14:25:40 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 200 - "-" "curl/7.29.0"
127.0.0.1 - - [26/Dec/2017:14:26:52 +0800] "GET http://111.com/upload/123.php HTTP/1.1" 200 25 "-" "curl/7.29.0"
172.16.111.1 - - [26/Dec/2017:14:29:07 +0800] "GET / HTTP/1.1" 200 12 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"
172.16.111.1 - - [26/Dec/2017:14:29:16 +0800] "GET /123.php HTTP/1.1" 200 7 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"
172.16.111.1 - - [26/Dec/2017:14:29:31 +0800] "GET /uploab/123.php HTTP/1.1" 404 212 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"
172.16.111.1 - - [26/Dec/2017:14:29:43 +0800] "GET /upload/123.php HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"
172.16.111.1 - - [26/Dec/2017:14:29:44 +0800] "GET /upload/123.php HTTP/1.1" 200 25 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"
127.0.0.1 - - [26/Dec/2017:15:03:15 +0800] "GET http://111.com/upload/123.php HTTP/1.1" 403 223 "-" "curl/7.29.0"
127.0.0.1 - - [26/Dec/2017:15:03:42 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 403 - "-" "curl/7.29.0"
127.0.0.1 - - [26/Dec/2017:15:08:20 +0800] "HEAD http://111.com/upload/123.php HTTP/1.1" 200 - "-" "xietao xietao"
解释说明:
  常用配置选项:

  使用参数 -A 指定了它的user_agent后就可以访问。
使用参数 -e 指定referer
使用参数 -x 相对省略本地绑定hosts
使用参数 -I 查看状态码


php相关配置

  虽然PHP是以httpd一个模块的形式存在,但是PHP本身也有自己的配置文件。


1. 查看PHP配置文件位置

[root@gary-tao 111.com]# ls
123.php  admin  index.php  qq.png  upload
[root@gary-tao 111.com]# vi index.php //编辑index文件,输入以下内容,保存退出。



  • 浏览器访问:http://111.com/index.php
DSC0003.png



  • 复制源码包里开发配置文件

[root@gary-tao 111.com]# cd /usr/local/src/php-7.1.6
[root@gary-tao php-7.1.6]# cp php.ini-development /usr/local/php7/etc/php.ini
[root@gary-tao php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful //重新加载配置
  结果如下图:
DSC0004.png


解释说明:

  php.ini为PHP的配置文件,可以看出其在/usr/local/php7/etc/php.ini。


2.PHP的disable_functions

  PHP有诸多的内置的函数,有一些函数(比如exec)会直接调取linux的系统命令,如果开放将会非常危险,因此,基于安全考虑应该把一些存在安全风险的函数禁掉。

  示例如下:

[root@gary-tao php-7.1.6]# vim /usr/local/php7/etc/php.ini //搜索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
[root@gary-tao php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful //重新加载配置

因为加上了phpinfo函数,所以访问index.php时结果如下:
DSC0005.png


3.定义date.timezone,如果不定义会导致有告警信息

[root@gary-tao php-7.1.6]# vim /usr/local/php7/etc/php.ini //找到date.timezone
定义如下:
date.timezone = Asia/Shangahi(或Chongqing)

示例图如下:
DSC0006.png


4. 配置 error_log

  PHP的日志对于程序员来讲非常重要,它是排查问题的重要手段。

  如果加上了phpinfo函数后,浏览器上访问http://111.com/index.php 就会有信息输出,这样也暴露的地址目录,相对来说也不安全,我们需要把报错信息也隐藏掉,操作如下:

[root@gary-tao php-7.1.6]# vim /usr/local/php7/etc/php.ini  //搜索display_errors
定义如下:
display_errors = Off
[root@gary-tao php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful

修改示意图
DSC0007.png


浏览访问结果如下:
DSC0008.png


使用curl测试如下:

[root@gary-tao php-7.1.6]# curl -A "xietao xietao" -x127.0.0.1:80 'http://111.com/index.php'
[root@gary-tao php-7.1.6]# curl -A "xietao xietao" -x127.0.0.1:80 'http://111.com/index.php' -I
HTTP/1.1 200 OK
Date: Tue, 26 Dec 2017 09:02:01 GMT
Server: Apache/2.4.29 (Unix) PHP/7.1.6
X-Powered-By: PHP/7.1.6
Cache-Control: max-age=0
Expires: Tue, 26 Dec 2017 09:02:01 GMT
Content-Type: text/html; charset=UTF-8

总结:配置了display_errors = Off后,浏览器访问没有任何输出信息,一片空白,使用curl输出也是一样,这样我们就无法判断是否有问题,所以需要配置错误日志。
  修改配置日志示例如下:

[root@gary-tao php-7.1.6]# vim /usr/local/php7/etc/php.ini
定义如下:
//搜索log_errors 改为 log_errors =On
//搜索error_log 改为 /tmp/php/php_errors.log
//搜索error_reporting 改为 error_reporting = E_ALL & ~E_NOTICE
//搜索display_errors 改为 display_errors = Off
[root@gary-tao php-7.1.6]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@gary-tao php-7.1.6]# /usr/local/apache2.4/bin/apachectl graceful
[root@gary-tao php-7.1.6]# curl -A "xietao xietao" -x127.0.0.1:80 'http://111.com/index.php'
[root@gary-tao php-7.1.6]# ls /tmp/
pear  php_errors.log  systemd-private-c13d62a36c594e09a55010e8f304eb60-vmtoolsd.service-1qgl8W
[root@gary-tao php-7.1.6]# ls -l /tmp/php_errors.log
-rw-r--r-- 1 daemon daemon 290 12月 26 17:13 /tmp/php_errors.log
[root@gary-tao php-7.1.6]# ps aux |grep httpd
root       5358  0.0  1.4 260000 14804 ?        Ss   12月19   0:37 /usr/local/apache2.4/bin/httpd -k graceful
daemon    14250  0.0  1.3 546828 13604 ?        Sl   17:13   0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon    14251  0.0  1.1 546828 11580 ?        Sl   17:13   0:00 /usr/local/apache2.4/bin/httpd -k graceful
daemon    14252  0.0  1.8 682124 18552 ?        Sl   17:13   0:00 /usr/local/apache2.4/bin/httpd -k graceful
root      14340  0.0  0.0 112680   972 pts/0    S+   17:15   0:00 grep --color=auto httpd
[root@gary-tao php-7.1.6]# grep error_log /usr/local/php7/etc/php.ini
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
error_log = /tmp/php_errors.log
;error_log = syslog
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@gary-tao php-7.1.6]# touch /tmp/php_errors.log ; chmod 777 /tmp/php_errors.log  //因为日志用户是daemon,日志是随着httpd的服务启动,为了保证PHP的错误日志所在目录存在,并且有权限为可写。
[root@gary-tao php-7.1.6]# cat /tmp/php_errors.log
[26-Dec-2017 17:13:35 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
[26-Dec-2017 17:13:47 Asia/Shanghai] PHP Warning:  phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2

模拟一个错误演示:

[root@gary-tao php-7.1.6]# vim /data/wwwroot/111.com/2.php //编辑如下内容

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-650596-1-1.html 上篇帖子: LAMP(apache禁止解析php,限制user_agent,php配置,open_bashdir 下篇帖子: 访问控制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表