一、访问控制之限定某个目录禁止解析php
1、作用:对某些需要上传文件的目录进行限制解析PHP,防止他人上传php代码写的木马程序获取服务器权限。
2、编辑虚拟主机内容,在原来的基础上增加如下内容:
<Directory /data/testphp/111.com/upload>
php_admin_flag engine off
# <FilesMatch (.*)\.php(.*)>
# Order allow,deny
# Deny from all
# </FilesMatch>
</Directory>
#注释掉的代码如果加上直接是403,不加的话会显示php源代码。
3、创建相对应的目录与文件
mkdir -p /data/testphp/111.com/upload
[root@wangbing ~]# vim /data/testphp/111.com/upload/test.php
4、测试
1)当注释掉FilesMatch段时,显示源代码
2)当打开FilesMatch段时,显示403
二、限制user_agent
1、user_agent :浏览器表识
2、编辑虚拟主机配置文件:
<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.
3、测试
1)此时我们发下无法访问,就是因为user_agent 匹配到了curl
2)指定 user_agent 访问 curl -A "fgsdgfjsbf" -x127.0.0.1:80 'http://111.com/123.php' -I
-A可以指定user_agent
当指定user_agent 没有匹配到A时可以访问。
三、php相关配置
1、查看php配置文件
命令:/usr/local/php/bin/php -i |grep -i "loaded configuration file";有时候找到的路径可能不准。
2、用web查找,在访问站点下创建phpinfo,在web下查看php配置文件径。
3、编辑配置文件/usr/local/php/etc/php.ini
1)定义date.timezone,如下图没有定义date.timezone,会有如下警告,定义后没有了。
date.timezone = Asia/Shanghai
2)编辑 disable_functions 函数
disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandi
r,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,phpinfo
3)当把phpinfo禁掉后,效果如下:
4)、定义display_errors
将 display_errors = On 修改为 display_errors = Off
display_errors = On 会把错误日志显示在浏览器里,会暴露网站的一些信息,
而改为Off后,在浏览器中什么都不会显示了,是空白的。
同样用curl访问,也没有信息输出。
5)定义错误日志:
a、设置 log_errors=on 设置为on,可以让php记录错误日志,设置为off,不记录日志
b、设置 error_log=/var/log/php_errors.log 设置日志路径
c、error_reporting =E_ALL & ~E_NOTICE E_ALL为所有类型日志,记录所有类型的日志信息, &表示并且, ~表示排除,即排除notice信息。
6)测试
此时可以发现错误信息都保存到定义的日志当中了。
四、配置open_basedir
1、作用:将网站限定在指定目录里。
2、在php.ini中设置open_basedir
open_basedir =tmp:/data/testphp/1111.com
3、测试
当设定目录是1111.com时,可以发现访问时都是500,查看日志/var/log/php_errors,报错为111.com/iindex.php没有被允许。
4、将目录改为111.com,发现可以访问了。
5、修改php.ini是对所有站点一起限定目录,而网站有多个站点,修改php.ini起不到隔离站点的作用。那么可以在/usr/local/apache2/conf/extra/httpd-vhosts.conf定义
6、编辑虚拟主机文件,增加下面内容
<VirtualHost *:80>
DocumentRoot "/data/testphp/aaa.com"
ServerName aaa.com
ServerAlias www.aaa.com www.123.com
php_admin_value open_basedir "/data/testphp/abcd.com:/tmp/"
ErrorLog "logs/aaa.com-error_log"
CustomLog "logs/aaa.com-access_log" common
</VirtualHost>
7、测试