限定某个目录禁止解析php
某个目录下禁止解析 php,这个很有用,我们做网站安全的时候,这个用的很多, 比如某些目录可以上传文件(例如,图片,视频,文档等静态文件), 黑客可以通过上传带有木马的文件,然后执行这个文件来攻破我们的服务器,我们可以将该目录设置禁止PHP解析。这样就算上传的文件含有可执行木马,也不能执行。
- 测试目标:禁止PHP解析ccc.com下upload目录内的文件
- 编辑虚拟主机配置文件 vim /usr/local/httpd2.4/conf/extra/httpd-vhosts.conf
- 添加以下内容
php_admin_flag engine off
- 测试一下
- 在ccc.com下创建目录upload→mkdir/tmp/ccc.com/upload
- 在upload下写一个页面index.php→vim /tmp/ccc.com/upload/index.php
- 使用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
可以看到反馈回来的就是源代码,根本没有解析,使用浏览器访问的结果就是这个网页直接被下载了,根被解析不了。
- 为了检测试验的可信度,我们把配置文件中的配置注释掉,看一下反馈信息
[root@localhost ~]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php -IHTTP/1.1 200 OKDate: Fri, 24 Aug 2018 01:15:45 GMTServer: Apache/2.4.34 (Unix) PHP/5.6.37X-Powered-By: PHP/5.6.37Cache-Control: max-age=0Expires: Fri, 24 Aug 2018 01:15:45 GMTContent-Type: text/html; charset=UTF-8
可以看到,网页已经被解析了,再使用浏览器访问可以明显的看到解析后的页面
- 在上面的实验中我们看到,当我们配置了禁止php解析,反馈给访问者的信息是这个页面的源代码,这个对服务器的安全不是很友好,我们还可以通过给这个目录设置所有php文件都不能访问来将安全等级升级。
php_admin_flag engine off Order allow,deny deny from all
- 在使用curl访问就是403 Forbidden了
[root@localhost upload]# curl -x127.0.0.1:80 www.ccc.com/upload/index.php -IHTTP/1.1 403 ForbiddenDate: Fri, 24 Aug 2018 01:29:08 GMTServer: Apache/2.4.34 (Unix) PHP/5.6.37Content-Type: text/html; charset=iso-8859-1
- 使用浏览器访问
- /upload下的其他非php的页面仍然可以正常访问
限制user_agent
User-Agent(用户代理),即不让哪些浏览器或其他访问方式来访问我们的网站
实验目标:限制user_agent为curl和google浏览器的访问
- 编辑虚拟主机配置文件
vim /usr/local/apache/conf/extra/httpd-vhosts.conf
- 在配置文件中添加如下内容
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
- 配置完成之后,使用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.jpg403 Forbidden Forbidden
You don't have permission to access /upload/test.jpgon this server.
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”的方法关闭(例如某些虚拟主机中)。
-
作为 Apache 模块时,父目录中的 open_basedir 路径自动被继承。
-
用 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/"