一 禁止php解析
为了使某些网站更加安全,防止不法之徒上传某类伪装过的恶意木马文件,(比如php文件),盗取服务器重要资源,我们要针对一些目录做保护,禁止其解析php
核心配置文件内容
<Directory /data/wwwroot/www.123.com/upload>
php_admin_flag engine off
</Directory>
修改虚拟主机配置文件,-t ,graceful 后测试
我们发现将123.php放在其他在位置,可以正常解析,放在upload目录下,直接返回了源码,并未解析。
二访问控制user-agent
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
在具体配置useragent之前我们先看先下curl 访问和浏览器访问的useragent 以及refer 都是什么样子。先用浏览器访问下
"http://ask.apelearn.com/question/17964" 这条就是referer 信息,Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36 这一长串就是useragent 信息
我们用curl命令访问,-e 指定referer -A 指定useragent 可以把lvlinux 理解为某个爬虫信息
curl -x127.0.0.1:80 -e "http://www.baidu.com" -A "lvlinux" 123.com
curl -x127.0.0.1:80 123.com
对比下上面两条访问的日志,我们发现第一条访问记录了referer 百度,和useragent lvlinux 。 第二条记录了一个空的referer,useragent为curl/7.29.0
通过user_agent限制访问, 核心配置文件内容如下
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
NC是不区分大小写,OR是两条语句的逻辑连接符,或者的意思,F是forbidden
curl -A "123123" 指定user_agent
我们分别执行以下三条curl ,看下结果
curl -x127.0.0.1:80 123.com -I
curl -A "baidu.com" -x127.0.0.1:80 123.com -I
curl -A "sfsdf" -x127.0.0.1:80 123.com -I
三php相关配置
先来查看下php配置文件位置
我们之前安装完php时拷贝过php的配置文件php.ini
但是我们安装了两个版本的php,如何查看当前apache当前使用的php的配置文件呢,通过浏览器查看phpinfo文件信息,就可以很直观的看到。
下面我们编辑该文件做一些必要的配置
1.禁用某些函数的调用。这样做可以很有效的遏制某些木马捣乱。
搜索disabls_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,phpinfor
graceful 后,用浏览器测试phpinfo访问,出现了Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/www.123.com/345.php on line 2
2 关闭错误信息的页面显示
该错误信息暴露我们的网站目录,我们也不希望他显示,继续编辑配置文件
定义display_errors=off
这时候访问会发现没有任何输出。
3 定义错误日志
为了以后定位访问php解析出现的故障,我们需要给php单独定义错误日志。
搜索log_erros,改成如下log_errors=on
搜索error_log,指定错误日志位置error_log=/var/log/php/php_errors.log
再搜索error_reporting,定义要记录的错误日志级别,指的是有选择的记录。error_reporting = E_ALL & ~E_NOTICE
//根据提示选择不记录notice的格式
4 定义时区
日志配置完成后,搜索下date.timezone 定义下时区,防止一些报错信息。date.timezone =Asia/Shanghai
5 定义open_basedir
为了很有效的将灾难最小化, 比如我们有一个站点被黑客攻破,那么为了防止他继续黑入其他网站,
我们很有必要针对单个网站之间设立隔离目录,及时止损。我们发现php.ini里面一个open_basedir
的功能,但是他只能做到对于php总网站的限制。对于单个网站,我们需要在apache虚拟主机配置文件中定义。也就是在对应的虚拟主机,加入相应的配置即可。
为了方便测试,我们设置一个子目录onlyphp说明下它的作用php_admin_value open_basedir "/data/wwwroot/123.com/onlyphp/:/tmp/"
curl -x127.0.0.1:80 http://123.com/123.php -I
curl -x127.0.0.1:80 http://123.com/onlyphp/123.php -I
注意,该配置只是针对php的操作,限制php解析,不限制其他html的访问。不过上面的例子仅仅是说明下open_basedir的运作原理,实际应用当中我们当然不这么干,对每一个虚拟主机我们可以配置一个open_basedir ,让其php的解析相互隔离。也就是说对于www.123.com的网站,我们将open_basedir 设置为/data/wwwroot/123.com/:/tmp/ 对于www.abc.com的网站,我们设置为/data/wwwroot/abc.com/:/tmp/ 而不是将数据直接丢到wwwroot目录下。设置/tmp/目录的目的是允许数据缓存,不然没法上传图片等数据。
原文地址:http://blog.51cto.com/12606610/2105226