对付利用PHP措辞编写的网站,有一些目录是由需求上传文件的,如果被黑客上传了用php代码写的木马,由于网站可以实行php程序,终极会让黑客拿到做事器权限。为了避免这种情形发生,我们须要把能上传文件的目录直接禁止解析php代码。编辑配置文件:
php_admin_flag engine off
//Filesmatch的浸染是不许可解析源代码
Order allow,deny
Deny from all
重新加载配置文件后验证:
# mkdir upload //在www.123.com目录下创建upload文件夹
# ls
123.jpg 123.php 123.txt admin index.html upload
# cp 123.php upload/ //把123.php拷贝到upload文件夹
# curl -x127.0.0.1:80 www.123.com/upload/123.php -I //解析123.php时报403
HTTP/1.1 403 Forbidden
Date: Sat, 02 Jun 2018 22:21:09 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1
编辑配置文件去掉filesmatch后重新验证得到如下结果:
# curl -x127.0.0.1:80 www.123.com/upload/123.php
echo 123.php;
>
curl直接返回源代码,解释123.php不能正常解析。
2,限定user_agent。
user_agent可以理解成浏览器标识。当用curl访问时,user_agent为curl/7.29.0,当用firefox浏览器访问时,user_agent为Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0。
编辑配置文件:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .curl. [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .baidu.com. [NC]
RewriteRule . - [F]
这里用到了rewrite模块,%{HTTP_USR_AGENT} 为user_agent的内置变量,上例上匹配到curl或者baidu.com时,都会触发下面的规则。方括号中的OR表示或者,NC表示“不区分大小写”,F相称于Forbidden。
验证:curl -x127.0.0.1:80 www.123.com/123.php -I
HTTP/1.1 403 Forbidden
Date: Sun, 03 Jun 2018 06:57:41 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Content-Type: text/html; charset=iso-8859-1
curl -A \"大众123123\"大众 -x127.0.0.1:80 www.123.com/123.php -I
HTTP/1.1 200 OK
Date: Sun, 03 Jun 2018 06:57:51 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Cache-Control: max-age=0
Expires: Sun, 03 Jun 2018 06:57:51 GMT
Content-Type: text/html; charset=UTF-8
此处用curl -A 指定user_agent,第一个要求的user_agent为curl默认的curl/7.29.0,以是状态码是403,第二个要求的user_agent为自定义的“123123”,没有任何匹配条件,此时状态码应为200。
3,php配置。
虽然php因此httpd一个模板的形式存在的,但是php本身也有自己的配置文件。利用下面的命令查看php的配置文件:
# /usr/local/php/bin/php -i |grep -i \"大众loaded configuration file\公众
PHP Warning: Unknown: It is not safe to rely on the system's timezone settings. You are required to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line
Loaded Configuration File => /usr/local/php/etc/php.ini
(1) php.ini便是PHP的配置文件,第一行的警告是见告我们系统的时区设置有问题,编辑配置文件找到date.timezone设置为Asia/shanghai则不会再提示缺点。
# /usr/local/php/bin/php -i |grep -i \公众loaded configuration file\"大众
Loaded Configuration File => /usr/local/php/etc/php.ini
(2)php的disable_functions。php有很多内置的函数,有一些函数比如exec会直接调取linux系统命令,如果开放会非常危险。因此处于安全考虑该当把一些存在安全危险的函数禁止掉: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_close
禁用如上函数后须要重启httpd做事后才能生效。
(3)配置而error_log。php的日志很主要,它是排查问题的主要手段。编辑php的缺点日志,改动如下几项:
log_errors = On error_log =/var/log/php/php_errors.log error_reporting = E_ALL &~E_NOTICE display_errors = Off
log_errors 可以设置为on 或者off,on表示php会记录缺点日志。error_log设定缺点日志路径,error_reporting 设定缺点日志级别,E_ALL为所有类型的日志,不管是提醒还是警告的都会记录。&表示并且~表示打消,以是E_ALL &~E_NOTICE表示的是除了notice之外的所有日志。display_errors如果设置为on则会把缺点日志直接显示在浏览器里,这样对付用户访问来说体验不好,而且还会暴露网站的一些文件路径等主要信息,以是要设置为off。设置完php.inf还须要做如下操作:
# mkdir /var/log/php
# chmod 777 /var/log/php/ //须要担保php缺点日志所在的目录存在,并且权限为可写
# /usr/local/apache2/bin/apachectl graceful
# cat /var/log/php/php_errors.log
[03-Jun-2018 14:44:02 Asia/shanghai] PHP Parse error: syntax error, unexpected 'php' (T_STRING), expecting ',' or ';' in /data/wwwroot/www.123.com/123.php on line 2
去掉123.php结尾的;号查看缺点日记就可以判断出错误了。
(4)配置open_basedir。open_basedir的浸染是将网站限定在指定目录里,就算该站点被黑了,黑客也只能在该目录下面有所作为,而不能旁边其它目录。如果做事器上只有一个站点,那可以直接再php.ini中设置open_basedir参数,如果做事器上有多个站点那在php.ini中设置就不得当了。
打开配置文件vim /usr/local/php/etc/php.ini设置open_basedir:open_basedir =/tmp:/data/wwwroot/www.123.com
open_basedir可以是多个目录,可以用:冒号隔开。现在已经限定了php只能在/tmp:和/data/wwwroot/www.123.com两个目录下活动。
单个虚拟主机设置open_basedir:
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
php_admin_value open_basedir \"大众/data/wwwroot/www.123.com/:/tmp/\"大众
起浸染的是php_admin_value ,它可以定义php.ini里面的参数,除此之外还可以定义error_log之类的。