标签:限定某个目录禁止解析php 限制user_agent PHP相关配置
一、限定某个目录禁止解析php禁止解析php主要是为了安全,一般静态文件所存放的目录下是不允许放PHP的
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<Directory /data/wwwroot/111.com/upload>
php_admin_flag engine off //禁止解析PHP
<FilesMatch (.*)\.php(.*)> //访问php后缀的全部拒绝,拒绝后都无法访问了,更不用说解析了。
Order allow,deny
Deny from all
</FilesMatch>
</Directory>
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful
# mkdir upload
# cp 123.php upload/
# curl -x 127.0.0.1:80 "http://111.com/upload/123.php" -I 测试123.php
HTTP/1.1 403 Forbidden
将FilesMatch的几行注释后,禁止解析PHP,再测试,无法解析,显示源代码:
# curl -x 127.0.0.1:80 "http://111.com/upload/123.php"
<?php
echo "123,php";
二、限制user_agent
cc攻击:遇到user_agent很规律的请求,就可以判定是cc攻击。cc攻击,一秒钟访问N次服务器。
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.* [NC]
RewriteRule .* - [F]
</IfModule>
OR:or,表示或者,curl或者baidu。
NC:忽略大小写。
F:Forbidden,禁止。
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful
测试:
# curl -x 127.0.0.1:80 "http://111.com/123.php" -I
HTTP/1.1 403 Forbidden
# curl -x 127.0.0.1:80 "http://111.com/" -I
HTTP/1.1 403 Forbidden
因为用的curl,所以会被拒绝。
# curl -A "12345" -x 127.0.0.1:80 "http://111.com/" -I
HTTP/1.1 200 OK
# curl -A "ABC" -x 127.0.0.1:80 "http://111.com/" -I
HTTP/1.1 200 OK
-A:指定user_agent。指定了user_agent以后,这个RewriteRule就没意义了。
-e:指定referer。
-I:查看状态码。
-x:指定目标IP。
三、PHP相关配置
(一)查看PHP配置文件位置:
1.# /usr/local/php/bin/php -i |grep -i "loaded configuration file"
有时候这一条不准。
2.一个很精准的办法,在虚拟主机的目录下创建一个index.php文件,然后将内容编辑为phpinfo();,然后用浏览器访问这个index.php的文件就可以查看到它配置文件所在的目录,但是并没有加载。
再复制一个模板到对应的该目录下。
# cd /usr/local/src/php-7.1.6/
# cp php.ini-development /usr/local/php7/etc/php.ini
# /usr/local/apache2.4/bin/apachectl graceful
再次访问index.php,可以看到已经加载了。
再编辑就好了。
(二)disable_functions
# vim /usr/local/php7/etc/php.ini
disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec
,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc
_close,phpinfo
这样设置,phpinfo和其他的函数就不能使用了,被禁止了:
Warning: phpinfo() has been disabled for security reasons in /data/wwwroot/111.com/index.php on line 2
更改后,需要重新加载配置文件才能生效:
# /usr/local/apache2.4/bin/apachectl graceful
(三)date.timezone = Asia/beijing 定义时间
(四)display_errors 访问时的错误信息,如果不允许访问,显示的就是白页
display_errors
; Default Value: On
; Development Value: Off 两个版本还有其他,开启或关闭。
; Production Value: Off 开启单个时,前面的分号 要去掉。
; http://php.net/display-errors
display_errors = On 这里关闭,将全部关闭。
(五)log_error=on错误日志是否开启
error_log = /tmp/php_errors.log定义错误日志的位置。
测试:可以看到生成了php_error.log。它的属主和属组都是deamon,这个日志是以httpd这个进程的身份生成的。有时候定义了一个错误日志,但是错误日志一直没有生成,就要检查一下错误日志所在的目录有没有写权限。
(六)error_reporting = E_ALL定义日志的级别
默认是E_ALL,全部记录。生产环境中是Show all errors, except for notices
(七)open_basedir
作用:将网站限定在指定目录里,就算该站点被黑,黑客也只能在该目录下面有作为,而不能动其他的目录。如果服务器上只有一个站点,那么可以直接在php.ini中设置open_basedir参数。如果服务器上跑的站点比较多,那在php.ini设置就不合适了,因为php.ini中只能定义一次,也就是说所有站点都一起定义限定的目录,那这样就起不到隔离多个站点的目的。先学习如何在php.ini中设置open_basedir:
# vim /usr/local/php7/etc/php.ini
open_basedir = /data/wwwroot/111.com:/tmp 针对全部站点的。
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
也可以在虚拟主机配置文件设置
php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
解析:
php_admin_value:可以定义php.ini里面的一些参数,比如error_log等。后面跟参数,然后指定的目标路径。
可以在不同的虚拟主机下进行配置,这里设置为/tmp,临时文件都限制了,黑客就不能上传文件了。
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
# /usr/local/apache2.4/bin/apachectl graceful
扩展
apache开启压缩 http://ask.apelearn.com/question/5528
apache2.2到2.4配置文件变更 http://ask.apelearn.com/question/7292
apache options参数 http://ask.apelearn.com/question/1051
apache禁止trace或track防止xss http://ask.apelearn.com/question/1045
apache 配置https 支持ssl http://ask.apelearn.com/question/1029
四十四、限定某个目录禁止解析php、限制user_agent、PHP相关配置
标签:限定某个目录禁止解析php 限制user_agent PHP相关配置
原文地址:http://blog.51cto.com/13576245/2104727