十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
查找PHP配置文件
“專業(yè)、務實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 創(chuàng)新互聯(lián)建站是您可以信賴的網(wǎng)站建設服務商、專業(yè)的互聯(lián)網(wǎng)服務提供商! 專注于成都網(wǎng)站設計、網(wǎng)站制作、軟件開發(fā)、設計服務業(yè)務。我們始終堅持以客戶需求為導向,結(jié)合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領市場!
① 命令行(不推薦,服務器有多個php,httpd不一定加載的此模塊)
[root@wy ~]# /usr/local/php/bin/php -i | grep 'Loaded Configuration'
Loaded Configuration File => /usr/local/php/etc/php.ini
② 調(diào)用php函數(shù)(推薦使用,精確)
[root@wy ~]# vim /data/www/phpinfo.php
phpinfo();
?>
禁掉一些危險的函數(shù)
## 編輯配置文件,查找到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這兩個函數(shù)是調(diào)用linux命令非常危險必須禁用;
有時候也會禁止phpinfo函數(shù);
#重啟apache,再刷新網(wǎng)頁可看到禁掉的函數(shù)
[root@wy ~]# /usr/local/apache2/bin/apachectl restart
配置PHP錯誤日志
## 關閉此選項,如果PHP代碼有錯,將不會提示錯誤信息直接顯示白頁
[root@wy ~]# vim /usr/local/php/etc/php.ini
display_errors = Off/On ## 默認Off
解釋說明:
雖然開啟便于程序調(diào)試,但***獲取到這些錯誤可能會發(fā)起***,不安全;
## 確認開啟
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
解釋說明:
設置日志級別就是在過濾錯誤日志記錄呢些內(nèi)容;
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它要去訪問一個網(wǎng)站,它要找到
一個路徑,我們有給它定義一個路徑,比如說/data/www,那這個時候如果,假設這個你的環(huán)境,你的網(wǎng)站
有一些漏洞,讓不法分子獲得了一些權限,他可以上傳一個他自己的***,那他這個***呢可以獲得你服務
器上的一些信息,比如可以獲得一些目錄、一些文件,可以查看,那這個時候呢,我們應該想到一個策略,
為了以防萬一,我們應該把它限制死在某一個目錄下,因為我們網(wǎng)站在/data/www下,那我們就應該給它
限定死,你只能訪問/data/www這個目錄,其他的目錄(比如根目錄、etc目錄),你是不可以查看的,如何
去做呢
## 編輯配置文件
[root@wy ~]# vim /usr/local/php/etc/php.ini
open_basedir = /data/www/:/tmp/
解釋說明:
/tmp/ 一般都會用到,就寫上
## 不過為了測試,故意寫錯受限制路徑(就出現(xiàn)了500錯誤)
open_basedir = /data/www1/:/tmp/
## apache重新加載
[root@wy ~]# /usr/local/apache2/bin/apachectl graceful
## 訪問網(wǎng)頁測試
## 命令行測試
[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
備注:訪問網(wǎng)頁后,錯誤日志沒有生成,我又自己解析的,這才出來錯誤日志。
其實在apache里同樣可以定義,假如說我們現(xiàn)在有多個虛擬主機,多個網(wǎng)站,多個網(wǎng)站你就應該去做多個
open_basedir的限制,如果用php.ini去做,只能配置一句;你要是限定多個目錄的話,不同的站點你是
沒有辦法區(qū)分開的,所以我們可以針對apache的虛擬主機去做一些限制,每一個虛擬主機(VirtualHost)使用一個open_basedir(好處在于我們可以區(qū)分不同的虛擬主機),如何去配置?那先把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