限定某个目录禁止解析php 限制user_agent php相关配置

1,限定某个目录禁止解析php。

    对于使用PHP语言编写的网站,有一些目录是由需求上传文件的,如果被黑客上传了用php代码写的木马,由于网站可以执行php程序,最终会让黑客拿到服务器权限。为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析php代码。编辑配置文件:

        <Directory /data/wwwroot/www.123.com/upload>
                php_admin_flag engine off
                <FilesMatch (.*)\.php(.*)>     //Filesmatch的作用是不允许解析源代码
                Order allow,deny
                Deny from all
                </FilesMatch>

        </Directory>

重新加载配置文件后验证:

 # mkdir upload           //在www.123.com目录下创建upload文件夹
# ls
123.jpg  123.php  123.txt  admin  index.html  upload

# cp 123.php upload/           //把123.php拷贝到upload文件夹

# curl -x127.0.0.1:80 www.123.com/upload/123.php -I   //解析123.php时报403
HTTP/1.1 403 Forbidden
Date: Sat, 02 Jun 2018 22:21:09 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32

Content-Type: text/html; charset=iso-8859-1

编辑配置文件去掉filesmatch后重新验证得到如下结果:

# curl -x127.0.0.1:80 www.123.com/upload/123.php
<?php
echo 123.php;
>

curl直接返回源代码,说明123.php不能正常解析。

2,限制user_agent。

      user_agent可以理解成浏览器标识。当用curl访问时,user_agent为curl/7.29.0,当用firefox浏览器访问时,user_agent为Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0。

     编辑配置文件:

        <IfModule mod_rewrite.c>
                RewriteEngine on
                RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]
                RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
                RewriteRule .* - [F]
        </IfModule>

   这里用到了rewrite模块,%{HTTP_USR_AGENT} 为user_agent的内置变量,上例上匹配到curl或者baidu.com时,都会触发下面的规则。方括号中的OR表示或者,NC表示“不区分大小写”,F相当于Forbidden。

验证:curl -x127.0.0.1:80 www.123.com/123.php -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 06:57:41 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1


curl -A "123123" -x127.0.0.1:80 www.123.com/123.php -I
HTTP/1.1 200 OK
Date: Sun, 03 Jun 2018 06:57:51 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Cache-Control: max-age=0
Expires: Sun, 03 Jun 2018 06:57:51 GMT
Content-Type: text/html; charset=UTF-8  

 

此处用curl -A 指定user_agent,第一个请求的user_agent为curl默认的curl/7.29.0,所以状态码是403,第二个请求的user_agent为自定义的“123123”,没有任何匹配条件,此时状态码应为200。

   3,php配置。

        虽然php是以httpd一个模板的形式存在的,但是php本身也有自己的配置文件。先从php的源码包里面拷贝php的配置文件。命令:# cd /usr/local/src/php-7.1.6/
           # cp php.ini-development /usr/local/php7/etc/php.ini

使用下面的命令查看php的配置文件:

 # /usr/local/php/bin/php -i |grep -i "loaded configuration file" 
PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 

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

     (1) php.ini就是PHP的配置文件,第一行的警告是告诉我们系统的时区设置有问题,编辑配置文件找到date.timezone设置为Asia/shanghai则不会再提示错误。

# /usr/local/php/bin/php -i |grep -i "loaded configuration file"
Loaded Configuration File => /usr/local/php/etc/php.ini

      (2)php的disable_functions。php有很多内置的函数,有一些函数比如exec会直接调取linux系统命令,如果开放会非常危险。因此处于安全考虑应该把一些存在安全危险的函数禁止掉:vim /usr/local/php/etc/php.ini 搜索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    

 禁用如上函数后需要重启httpd服务后才能生效。

   (3)配置而error_log。php的日志很重要,它是排查问题的重要手段。编辑php的错误日志,改动如下几项:

        log_errors = On   error_log =/var/log/php/php_errors.log      error_reporting = E_ALL &~E_NOTICE  display_errors = Off

     log_errors 可以设置为on 或者off,on表示php会记录错误日志。error_log设定错误日志路径,error_reporting 设定错误日志级别,E_ALL为所有类型的日志,不管是提醒还是警告的都会记录。&表示并且~表示排除,所以E_ALL &~E_NOTICE表示的是除了notice之外的所有日志。display_errors如果设置为on则会把错误日志直接显示在浏览器里,这样对于用户访问来说体验不好,而且还会暴露网站的一些文件路径等重要信息,所以要设置为off。设置完php.inf还需要做如下操作:

# mkdir /var/log/php                      
# chmod 777 /var/log/php/                                     //需要保证php错误日志所在的目录存在,并且权限为可写

# /usr/local/apache2/bin/apachectl graceful

# cat /var/log/php/php_errors.log 
[03-Jun-2018 14:44:02 Asia/shanghai] PHP Parse error:  syntax error, unexpected 'php' (T_STRING), expecting ',' or ';' in /data/wwwroot/www.123.com/123.php on line 2

去掉123.php结尾的;号查看错误日记就可以判断出错误了。

(4)配置open_basedir。open_basedir的作用是将网站限定在指定目录里,就算该站点被黑了,黑客也只能在该目录下面有所作为,而不能左右其它目录。如果服务器上只有一个站点,那可以直接再php.ini中设置open_basedir参数,如果服务器上有多个站点那在php.ini中设置就不合适了。

    打开配置文件vim /usr/local/php/etc/php.ini 设置open_basedir:open_basedir =/tmp:/data/wwwroot/www.123.com

    open_basedir可以是多个目录,可以用:冒号隔开。现在已经限制了php只能在/tmp:和/data/wwwroot/www.123.com两个目录下活动。

    单个虚拟主机设置open_basedir:

    vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

    php_admin_value open_basedir "/data/wwwroot/www.123.com/:/tmp/"

  起作用的是php_admin_value ,它可以定义php.ini里面的参数,除此之外还可以定义error_log之类的。

 

 

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值