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

限定某个目录禁止解析php

某个目录下禁止解析 php,这个颇有用,咱们作网站安全的时候,这个用的不少, 好比某些目录能够上传文件(例如,图片,视频,文档等静态文件), 黑客能够经过上传带有木马的文件,而后执行这个文件来攻破咱们的服务器,咱们能够将该目录设置禁止PHP解析。这样就算上传的文件含有可执行木马,也不能执行。php

  • 测试目标:禁止PHP解析ccc.com下upload目录内的文件
  1. 编辑虚拟主机配置文件 vim /usr/local/httpd2.4/conf/extra/httpd-vhosts.conf
  2. 添加如下内容
<Directory /tmp/ccc.com/upload>     
        php_admin_flag engine off                               
</Directory>
  1. 测试一下
  • 在ccc.com下建立目录upload→mkdir/tmp/ccc.com/upload
  • 在upload下写一个页面index.php→vim /tmp/ccc.com/upload/index.php
<?php
phpinfo ();
?>
  • 使用curl -x127.0.0.1:80 www.ccc.com/upload/index.php 测试
[root@localhost ~]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php
<?php
phpinfo ();
?>

能够看到反馈回来的就是源代码,根本没有解析,使用浏览器访问的结果就是这个网页直接被下载了,根被解析不了。html

  1. 为了检测试验的可信度,咱们把配置文件中的配置注释掉,看一下反馈信息
[root@localhost ~]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php -I
HTTP/1.1 200 OK
Date: Fri, 24 Aug 2018 01:15:45 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.37
X-Powered-By: PHP/5.6.37
Cache-Control: max-age=0
Expires: Fri, 24 Aug 2018 01:15:45 GMT
Content-Type: text/html; charset=UTF-8

能够看到,网页已经被解析了,再使用浏览器访问能够明显的看到解析后的页面 shell

  1. 在上面的实验中咱们看到,当咱们配置了禁止php解析,反馈给访问者的信息是这个页面的源代码,这个对服务器的安全不是很友好,咱们还能够经过给这个目录设置全部php文件都不能访问来将安全等级升级。
<Directory /tmp/ccc.com/upload>
        php_admin_flag engine off
        <FilesMatch (.*)\.php(.*)>
           Order allow,deny
           deny from all
		   </FilesMatch>
</Directory>
  • 在使用curl访问就是403 Forbidden了
[root@localhost upload]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php -I
HTTP/1.1 403 Forbidden
Date: Fri, 24 Aug 2018 01:29:08 GMT
Server: Apache/2.4.34 (Unix) PHP/5.6.37
Content-Type: text/html; charset=iso-8859-1
  • 使用浏览器访问
  • /upload下的其余非php的页面仍然能够正常访问

限制user_agent

User-Agent(用户代理),即不让哪些浏览器或其余访问方式来访问咱们的网站apache

实验目标:限制user_agent为curl和google浏览器的访问vim

  • 编辑虚拟主机配置文件 vim /usr/local/apache/conf/extra/httpd-vhosts.conf
  • 在配置文件中添加以下内容
<IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]                   #NC表示忽略大小写,OR表示或者的意思,上下两个条件或者
        RewriteCond %{HTTP_USER_AGENT}  .*Chrome* [NC]             #限制user_ragent 为curl或者Google浏览器的进行访问
        RewriteRule  .*  -  [F]                                                                          #直接F表示,Forbidden
    </IfModule>
  • 配置完成以后,使用curl访问,反馈的界面是403,使用Google的浏览器Chrome也是forbidden,使用IE浏览器能够正常访问,说明配置生效。另外curl -A是能够指定代理的,好比curl -A "www.baidu.com" -x127.0.0.1:80/www.ccc.com/upload/test.jpg 指定的代理是www.baidu.com,反馈的代码就是200,表示能正常访问。
[root@localhost logs]# curl -x127.0.0.1:80 www.ccc.com/upload/test.jpg
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /upload/test.jpg
on this server.<br />
</p>
</body></html>

PHP相关配置

  • PHP的配置文件存放地址,能够在phpinfo面查看相关的信息 Loaded Configuration File 指的就是配置文件所在目录
  • 若是在Loaded Configuration File这一栏显示的是(none),那么说明配置文件没有加载
  • 若是须要启动配置文件,咱们能够拷贝模板配置文件,模板配置文件一般在源码包里面放置的有,执行命令: cp php.ini-development /usr/local/php/etc/php.ini
  • 拷贝配置文件后须要从新加载下Apache再进行刷新就能够了
  • 编辑配置文件 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_clos在咱们测试完以后,业务须要上线的时候,应该把phpinfo也添加进去。
  • 定义date.timezone ,时区 搜索关键字:date.timezone 找到以下行:date.timezone= 在后面添加 Asia/Shanghai,将时区定义为上海
  • 定义错误日志 搜索关键字:display_errors=On 将其中的On改成Off, 更改以后错误的信息不会输出到浏览器里面,避免目录出现暴露,若是不改成off咱们看一下它的错误输出信息: 会将咱们后台的目录暴露给访问者。
  • 定义错误日志存放的地址 错误信息不暴露给访问者,可是管理员须要查看错误日志用以排错,这就须要配置错误日志的目录了 首先搜索Log_errors= 赋值On ,意思是开启错误日志 搜索关键字:error_log= 在后面能够定义错误日志的存放路径/tmp/php_errors.log
  • 在生产环境中,还须要从新定义一下错误日志的级别,由于默认级别为E_ALL,会写入全部的记录,好比warning ,notice, error等,由于notice信息不少,并且没有记录的意义,因此错误日志的级别咱们通常使用E_ALL&~E_NOTICE这个。 搜索error_reporting= 赋值error_reporting=E_ALL&~E_NOTICE 就能够了。

open_basedir

  • 将 PHP 所能打开的文件限制在指定的目录树,包括文件自己。本指令不受安全模式打开或者关闭的影响。浏览器

  • 当一个脚本试图用例如 fopen() 或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树以外时 PHP 将拒绝打开它。全部的符号链接都会被解析,因此不可能经过符号链接来避开此限制。安全

  • 特殊值 . 指明脚本的工做目录将被做为基准目录。但这有些危险,由于脚本的工做目录能够轻易被 chdir() 而改变。服务器

  • 在 httpd.conf 文件中中,open_basedir 能够像其它任何配置选项同样用“php_admin_value open_basedir none”的方法关闭(例如某些虚拟主机中)。curl

  • 做为 Apache 模块时,父目录中的 open_basedir 路径自动被继承。socket

  • 用 open_basedir 指定的限制其实是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会容许访问“/dir/include”和“/dir/incls”,若是它们存在的话。

  • 若是要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”。

  • 针对不一样的站点设置open_basedir,将用户可操做的文件限制在某目录下

  • 编辑虚拟主机配置文件 vim /usr/local/apache/conf/extra/httpd-vhosts.conf

  • 在配置文件里面添加以下内容便可实现 php_admin_value open_basedir "/tmp/ccc.com:/tmp/"

相关文章
相关标签/搜索