十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
查找PHP配置文件
“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 创新互联建站是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于成都网站设计、网站制作、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!
① 命令行(不推荐,服务器有多个php,httpd不一定加载的此模块)
[root@wy ~]# /usr/local/php/bin/php -i | grep 'Loaded Configuration'
Loaded Configuration File => /usr/local/php/etc/php.ini
② 调用php函数(推荐使用,精确)
[root@wy ~]# vim /data/www/phpinfo.php
phpinfo();
?>
禁掉一些危险的函数
## 编辑配置文件,查找到disable_functions
[root@wy ~]# vim /usr/local/php/etc/php.ini
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
解释说明:
配置disable_functions;
exec,shell_exec这两个函数是调用linux命令非常危险必须禁用;
有时候也会禁止phpinfo函数;
#重启apache,再刷新网页可看到禁掉的函数
[root@wy ~]# /usr/local/apache2/bin/apachectl restart
配置PHP错误日志
## 关闭此选项,如果PHP代码有错,将不会提示错误信息直接显示白页
[root@wy ~]# vim /usr/local/php/etc/php.ini
display_errors = Off/On ## 默认Off
解释说明:
虽然开启便于程序调试,但***获取到这些错误可能会发起***,不安全;
## 确认开启
log_errors = On
## 配置错误日志
error_log = /usr/local/php/logs/php_errors.log
解释说明:
配置的错误日志目录必须存在(mkdir /usr/local/php/logs)且必须写绝对路径
chown -R daemon.daemon /usr/local/php/logs/ 或者chmod 777 /usr/local/php/logs(因为生成错误日志的用户是apache,所以要有写权限)
## 日志级别
error_reporting = E_ALL & ~E_NOTICE
解释说明:
设置日志级别就是在过滤错误日志记录呢些内容;
E_ALL 包含所有的错误和警告(且包含了PHP5.4版本中的E_STRICT);
E_NOTICE 把所有的错误都显示,除了通知和代码的标准警告;
& 并且;
| 或者;
~ 取反;
是指 E_ALL 为真,或者 非E_NOTICE 为真;
## 为了测试,故意php文件写错
[root@wy ~]# cat /data/www/phpinfo.php
phpinfo();
e cho "ni hao php"; ## 此行故意写错
?>
## 检查并重新加载
[root@wy ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@wy ~]# /usr/local/apache2/bin/apachectl graceful
## 解析并查看生成的错误日志
[root@wy ~]# /usr/local/php/bin/php /data/www/phpinfo.php
[root@wy ~]# tail /usr/local/php/logs/php_errors.log
[06-Nov-2016 04:53:30 Asia/Chongqing] PHP Parse error: syntax error, unexpected T_STRING in /data/www/phpinfo.php on line 3
配置open_basedir
也是一个安全选项,它有什么意义呢,举个例子,咱们这个php,apache它要去访问一个网站,它要找到
一个路径,我们有给它定义一个路径,比如说/data/www,那这个时候如果,假设这个你的环境,你的网站
有一些漏洞,让不法分子获得了一些权限,他可以上传一个他自己的***,那他这个***呢可以获得你服务
器上的一些信息,比如可以获得一些目录、一些文件,可以查看,那这个时候呢,我们应该想到一个策略,
为了以防万一,我们应该把它限制死在某一个目录下,因为我们网站在/data/www下,那我们就应该给它
限定死,你只能访问/data/www这个目录,其他的目录(比如根目录、etc目录),你是不可以查看的,如何
去做呢
## 编辑配置文件
[root@wy ~]# vim /usr/local/php/etc/php.ini
open_basedir = /data/www/:/tmp/
解释说明:
/tmp/ 一般都会用到,就写上
## 不过为了测试,故意写错受限制路径(就出现了500错误)
open_basedir = /data/www1/:/tmp/
## apache重新加载
[root@wy ~]# /usr/local/apache2/bin/apachectl graceful
## 访问网页测试
## 命令行测试
[root@wy ~]# curl -xlocalhost:80 www.test.com/phpinfo.php -I
HTTP/1.0 500Internal Server Error
Date: Sat, 05 Nov 2016 21:23:53 GMT
Server: Apache/2.2.16 (Unix) DAV/2 PHP/5.3.28
X-Powered-By: PHP/5.3.28
Cache-Control: max-age=0
Expires: Sat, 05 Nov 2016 21:23:53 GMT
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug
## 查看日志
[root@wy ~]# /usr/local/php/bin/php /data/www/forum.php ## 解析
[root@wy ~]# tail /usr/local/php/logs/php_errors.log
[06-Nov-2016 05:30:41 Asia/Chongqing] PHP Warning: require():open_basedir restriction in effect. File(./source/class/class_core.php) is not within the allowed path(s): (/data/www1/:/tmp/)in /data/www/forum.php on line 15
[06-Nov-2016 05:30:41 Asia/Chongqing] PHP Warning: require(./source/class/class_core.php): failed to open stream: Operation not permitted in /data/www/forum.php on line 15
[06-Nov-2016 05:30:41 Asia/Chongqing] PHP Fatal error: require(): Failed opening required './source/class/class_core.php' (include_path='.:/usr/local/php/lib/php') in /data/www/forum.php on line 15
备注:访问网页后,错误日志没有生成,我又自己解析的,这才出来错误日志。
其实在apache里同样可以定义,假如说我们现在有多个虚拟主机,多个网站,多个网站你就应该去做多个
open_basedir的限制,如果用php.ini去做,只能配置一句;你要是限定多个目录的话,不同的站点你是
没有办法区分开的,所以我们可以针对apache的虚拟主机去做一些限制,每一个虚拟主机(VirtualHost)使用一个open_basedir(好处在于我们可以区分不同的虚拟主机),如何去配置?那先把php.ini的open_basedir先注释掉(注:php里;来作为注释),然后做下面的实验。
## 配置apache虚拟主机的open_basedir
[root@wy ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
DocumentRoot "/data/tmp"
ServerName tmp.com
php_admin_value open_basedir "/tmp/tmp/"
DocumentRoot "/data/www"
ServerName www.test.com
ServerAlias www.aaa.com
ServerAlias www.bbb.com
php_admin_value open_basedir "/data/www/:/tmp/"
解释说明:
在open_basedir时,一定要将目录/dir/(后面的/一定要加上)否则会包含www、www1、www2......
## 检查并重新加载
[root@wy ~]# /usr/local/apache2/bin/apachectl -t
Syntax OK
[root@wy ~]# /usr/local/apache2/bin/apachectl graceful