限定某个目录禁止解析php、限制user_agent、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 ();
?>

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

  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

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

  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(用户代理),即不让哪些浏览器或其他访问方式来访问我们的网站

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

  • 编辑虚拟主机配置文件 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”的方法关闭(例如某些虚拟主机中)。

  • 作为 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/"

转载于:https://my.oschina.net/u/3731306/blog/1933404

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值