common.inc.php文件1-20行代碼分析
/*從今天開始.我會一有時間就對PHPCMS 整站的代碼做一個詳細(xì)的分析.目的很簡單.讓大家都能在phpchina 里面得到進(jìn)步.
謝謝. 代碼講解分析全部是本人.按照本人的知識水平來講解.如果有說得不對的.請指正.也歡迎指正.大家一起進(jìn)步.謝謝
希望大家支持哦
首先我對 PHPCMS 的 頭程序文件開始講解 : include/common.inc.php 這個文件是程序啟動的核心文件.復(fù)制PHP內(nèi)容到剪貼板PHP代碼:
*/
<?php
/**
代碼講解分析: DreamFight
*/
$mtime = explode(' ', microtime());
$phpcms_starttime = $mtime[1] + $mtime[0];
/**
microtime() 當(dāng)前 Unix 時間戳以及微秒數(shù)。本函數(shù)僅在支持 gettimeofday() 系統(tǒng)調(diào)用的操作系統(tǒng)下可用。如果調(diào)用時不帶可選參數(shù),本函數(shù)以 "msec sec" 的格式返回一個字符串,其中 sec 是自 Unix 紀(jì)元(0:00:00 January 1, 1970 GMT)起到現(xiàn)在的秒數(shù),msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。
在windows下他的反回結(jié)果是這樣的形式:0.70312700 1230216275。
explode(separator,string,limit)函數(shù)把字符串分割為數(shù)組。
參數(shù) 描述
separator 必需。規(guī)定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可選。規(guī)定所返回的數(shù)組元素的最大數(shù)目。
*/
<?php
/**
代碼講解分析: DreamFight
*/
$mtime = explode(' ', microtime());
$phpcms_starttime = $mtime[1] + $mtime[0];
/**
microtime() 當(dāng)前 Unix 時間戳以及微秒數(shù)。本函數(shù)僅在支持 gettimeofday() 系統(tǒng)調(diào)用的操作系統(tǒng)下可用。如果調(diào)用時不帶可選參數(shù),本函數(shù)以 "msec sec" 的格式返回一個字符串,其中 sec 是自 Unix 紀(jì)元(0:00:00 January 1, 1970 GMT)起到現(xiàn)在的秒數(shù),msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。
在windows下他的反回結(jié)果是這樣的形式:0.70312700 1230216275。
explode(separator,string,limit)函數(shù)把字符串分割為數(shù)組。
參數(shù) 描述
separator 必需。規(guī)定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可選。規(guī)定所返回的數(shù)組元素的最大數(shù)目。
前邊這兩行的代碼主要就是計算腳本開始運行的時間。很常見的寫法。最后結(jié)算還在程序運行的終點位置。講到了在給各位說。
*/
unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
/**
把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局變量設(shè)置為 NULL 因為php4.1.0以上默認(rèn)以 $_POST 來替代。unset后防止程序運行在低版本會出現(xiàn)安全等問題。比如變量注入
*/
set_magic_quotes_runtime(0);
/*
在php.ini的配置文件中,有個布爾值的設(shè)置,就是magic_quotes_runtime,當(dāng)它打開時,php的大部分函數(shù)自動的給從外部引入的(包括數(shù)據(jù)庫或者文件)數(shù)據(jù)中的溢出字符加上反斜線。
% S* i; @; k! D- n" p0 k. {7 Q* ~9 U1 i$ Y& {' d4 R2 ]
當(dāng)然如果重復(fù)給溢出字符加反斜線,那么字符串中就會有多個反斜線,所以這時就要用set_magic_quotes_runtime()與get_magic_quotes_runtime()設(shè)置和檢測php.ini文件中magic_quotes_runtime狀態(tài)。. i% @5 ]' C N8 W. C4 u8 p
6 a; Y" {6 W' H# _! o h. Z
為了使自己的程序不管服務(wù)器是什么設(shè)置都能正常執(zhí)行。可以在程序開始用get_magic_quotes_runtime檢測設(shè)置狀態(tài)秋決定是否要手工處理,或者在開始(或不需要自動轉(zhuǎn)義的時候)用set_magic_quotes_runtime(0)關(guān)掉。& O* W6
地球人都知道。就是關(guān)了字符竄入庫自動轉(zhuǎn)意 比如 my name is on'x 轉(zhuǎn)成 my name is on \'x 為了最大的程序性能所以我們關(guān)掉吧~哈哈
*/
define('IN_PHPCMS', TRUE);
/**
程序入口標(biāo)記。為什么需要這個東西呢。就好比你進(jìn)一個小區(qū),保安大哥哥肯定要你簽字或是掛個鳥牌證明你是從正門進(jìn)來的。
防止你翻墻進(jìn)入去偷東西搞破壞。這個入口標(biāo)記也有這個功能。 在這里定義了一個常量 IN_PHPCMS 為 TRUE ,然后我在其他程序文件里面檢查這個標(biāo)記。如果不存在或不為真,
那么就基本可以肯定你這個家伙是個小偷來的。 人可能翻墻進(jìn)入。但程序怎么翻墻呢。只要在php.ini文件里面激活 allow_url_fopen選項,include() 就可以包含 URL 地址了。你想下如果你有個 放密碼的PHP文件。如果給人家include 了以后。你怕不怕。
*/
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));
/**
dirname(dirname(__FILE__));得到的是文件上一層目錄名.因為common.inc.php是在include文件夾中的,所以dirname(dirname(__FILE__))的反回地址就是:你的phpcms所在的目錄+include,這里它做了substr(dirname(__FILE__), 0, -8))這么個處理,就去掉了include 所以得到的就是你這個phpcms所在機(jī)器上的目錄了。
要主意substr(dirname(__FILE__), 0, -8))它所得到的目錄的路徑是是帶\的這樣是在瀏覽器中訪部一到的所在要把所有的\轉(zhuǎn)成/.
為了程序產(chǎn)品的跨平臺。自動獲取程序的安裝目錄路徑 ,定義為 PHPCMS_ROOT 常量。方便以后程序使用。建議大家都這樣做哦
*/
require PHPCMS_ROOT.'/include/global.func.php';
/**
包含 全局函數(shù) global.func.php 文件。里面放了些程序全局都有需要用的函數(shù).大家看到了吧。 常量 PHPCMS_ROOT 已經(jīng)發(fā)揮作用。 這樣程序給人家發(fā)布到了 二級目錄下。也不需要人家手動改整站根目錄路徑了。
自己好好理解下。。。。。
global.func.php這個頁面等后邊用到的時候來一一講解。
*/
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
/**
("/ union /i") 這個是正則的寫法?不懂正則的自己百度找教程來學(xué)。 這里不詳細(xì)說了
*/
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
/**
看這個意思很明了。 union :連接兩條SQL語句。 outfile : 主要用來導(dǎo)出數(shù)據(jù)庫資料到其他介質(zhì)上。
干啥要定義這兩個變量呢? 在 global.func.php 文件(前面已經(jīng)加載)里面有個函數(shù) strip_sql() 各位可以看下。
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
函數(shù)里面定義了這兩個變量為 global全局變量。 那么函數(shù)里就可以直接使用了。 先講解下這個函數(shù)吧。 顧名思義這個函數(shù)是過濾字符竄里面的SQL語句使得關(guān)鍵的SQL語句單詞失效。
主要過濾那些SQL語句呢。 主要是這幾個關(guān)鍵字: union select update outfile or 等。因為這幾個SQL字是極度容易在$_GET傳輸中給截注.
這個函數(shù)寫得實在精妙。 is_array 來判斷 $string 是否為數(shù)組。如果 是 就 array_map() 函數(shù)來遞歸過濾
當(dāng)遞歸調(diào)用 strip_sql() 以后 is_array()判斷 $string 肯定為假了,因為$string已經(jīng)不是數(shù)組而是字符竄。所以 執(zhí)行 preg_replace()函數(shù)。這個函數(shù)很好理解了。就是替換了。
這個函數(shù)的作用就是把$_POST中的內(nèi)容用一個strip_sql的方法來處理,
**/
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
/**
使用strip_sql()函數(shù)來過濾 $_POST $_GET $_COOKIE;
一般不是開源的站。很少過SQL關(guān)鍵字過濾。不過這個也是冒很大風(fēng)險的。
來說一下strip_sql這個函數(shù),它和里邊的array_map函數(shù)一起實現(xiàn)了這個函數(shù)的遞歸調(diào)用,以來實現(xiàn)字符的替換。
**/
unset($search_arr, $replace_arr);
/**
unset 使用過但以后不需要的變量。這個是很好的習(xí)慣。第一不會浪費內(nèi)存。如果變量存了大量的數(shù)據(jù)字節(jié),而后你的程序是一直不需要用的。那么
就會很浪費內(nèi)存。拉底程序性能 . 哈哈。真很書面。反正是好習(xí)慣我們都要學(xué)習(xí)的拉。
*/
$magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()檢測gpc是否系統(tǒng)自動轉(zhuǎn)意。 gpc 是什么呢? GET POST COOKIE 來來去去就這幾個東西羅。會返回 真或假
if(!$magic_quotes_gpc)
{
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
}
/**
判斷一下系統(tǒng)是否打開了自動對gpc進(jìn)行轉(zhuǎn)意這個選擇。如果是的話,就不需要我們自動轉(zhuǎn)意了。如果不是那么還是要老百姓的手段。自己動手豐衣足食。
來看下也是在global.func.php 文件里面定義的這個函數(shù): 其實是一個封裝好的php的 addslashes() 函數(shù)的函數(shù)。PHP都自己有了為什么還要自己封裝成函數(shù)呢?
理由很簡單。為了以后的擴(kuò)展更改容易羅。如果我們一開始就全部用 addslashes() 這個函數(shù)來對 ' 進(jìn)行轉(zhuǎn)意的話。那么以后隨著程序的發(fā)展。我可能想多過濾個 ^ * ( )之類的
那如何是好呢?所以為了以后孩子的成長。我們還是最好封起來吧。 記住:以后有可能會邊的東西。最好都封裝成模塊。函數(shù) 。類。 這樣程序的靈活度就上去了。下面我們就來品一下
這個函數(shù)。
function new_addslashes($string)
{
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
首先判斷是不是數(shù)組,如果不是那么把該值用作addslashes()的參數(shù),進(jìn)行轉(zhuǎn)意,并返回。
如果是數(shù)組那么一次取出該數(shù)組中的值來讓它轉(zhuǎn)意。
這個函數(shù)也是寫得賊好。也是同時考慮過濾 字符竄或數(shù)組,也是使用了 傳歸。看下就應(yīng)該明白了吧。這個不用說了。我們要學(xué)下這個思路這個方法方式哦。這樣才能進(jìn)
*/
*/
unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
/**
把 $HTTP_ENV_VARS $HTTP_POST_VARS 全局變量設(shè)置為 NULL 因為php4.1.0以上默認(rèn)以 $_POST 來替代。unset后防止程序運行在低版本會出現(xiàn)安全等問題。比如變量注入
*/
set_magic_quotes_runtime(0);
/*
在php.ini的配置文件中,有個布爾值的設(shè)置,就是magic_quotes_runtime,當(dāng)它打開時,php的大部分函數(shù)自動的給從外部引入的(包括數(shù)據(jù)庫或者文件)數(shù)據(jù)中的溢出字符加上反斜線。
% S* i; @; k! D- n" p0 k. {7 Q* ~9 U1 i$ Y& {' d4 R2 ]
當(dāng)然如果重復(fù)給溢出字符加反斜線,那么字符串中就會有多個反斜線,所以這時就要用set_magic_quotes_runtime()與get_magic_quotes_runtime()設(shè)置和檢測php.ini文件中magic_quotes_runtime狀態(tài)。. i% @5 ]' C N8 W. C4 u8 p
6 a; Y" {6 W' H# _! o h. Z
為了使自己的程序不管服務(wù)器是什么設(shè)置都能正常執(zhí)行。可以在程序開始用get_magic_quotes_runtime檢測設(shè)置狀態(tài)秋決定是否要手工處理,或者在開始(或不需要自動轉(zhuǎn)義的時候)用set_magic_quotes_runtime(0)關(guān)掉。& O* W6
地球人都知道。就是關(guān)了字符竄入庫自動轉(zhuǎn)意 比如 my name is on'x 轉(zhuǎn)成 my name is on \'x 為了最大的程序性能所以我們關(guān)掉吧~哈哈
*/
define('IN_PHPCMS', TRUE);
/**
程序入口標(biāo)記。為什么需要這個東西呢。就好比你進(jìn)一個小區(qū),保安大哥哥肯定要你簽字或是掛個鳥牌證明你是從正門進(jìn)來的。
防止你翻墻進(jìn)入去偷東西搞破壞。這個入口標(biāo)記也有這個功能。 在這里定義了一個常量 IN_PHPCMS 為 TRUE ,然后我在其他程序文件里面檢查這個標(biāo)記。如果不存在或不為真,
那么就基本可以肯定你這個家伙是個小偷來的。 人可能翻墻進(jìn)入。但程序怎么翻墻呢。只要在php.ini文件里面激活 allow_url_fopen選項,include() 就可以包含 URL 地址了。你想下如果你有個 放密碼的PHP文件。如果給人家include 了以后。你怕不怕。
*/
define('PHPCMS_ROOT', str_replace("\\", '/', substr(dirname(__FILE__), 0, -8)));
/**
dirname(dirname(__FILE__));得到的是文件上一層目錄名.因為common.inc.php是在include文件夾中的,所以dirname(dirname(__FILE__))的反回地址就是:你的phpcms所在的目錄+include,這里它做了substr(dirname(__FILE__), 0, -8))這么個處理,就去掉了include 所以得到的就是你這個phpcms所在機(jī)器上的目錄了。
要主意substr(dirname(__FILE__), 0, -8))它所得到的目錄的路徑是是帶\的這樣是在瀏覽器中訪部一到的所在要把所有的\轉(zhuǎn)成/.
為了程序產(chǎn)品的跨平臺。自動獲取程序的安裝目錄路徑 ,定義為 PHPCMS_ROOT 常量。方便以后程序使用。建議大家都這樣做哦
*/
require PHPCMS_ROOT.'/include/global.func.php';
/**
包含 全局函數(shù) global.func.php 文件。里面放了些程序全局都有需要用的函數(shù).大家看到了吧。 常量 PHPCMS_ROOT 已經(jīng)發(fā)揮作用。 這樣程序給人家發(fā)布到了 二級目錄下。也不需要人家手動改整站根目錄路徑了。
自己好好理解下。。。。。
global.func.php這個頁面等后邊用到的時候來一一講解。
*/
$search_arr = array("/ union /i","/ select /i","/ update /i","/ outfile /i","/ or /i");
/**
("/ union /i") 這個是正則的寫法?不懂正則的自己百度找教程來學(xué)。 這里不詳細(xì)說了
*/
$replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
/**
看這個意思很明了。 union :連接兩條SQL語句。 outfile : 主要用來導(dǎo)出數(shù)據(jù)庫資料到其他介質(zhì)上。
干啥要定義這兩個變量呢? 在 global.func.php 文件(前面已經(jīng)加載)里面有個函數(shù) strip_sql() 各位可以看下。
function strip_sql($string)
{
global $search_arr,$replace_arr;
return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}
函數(shù)里面定義了這兩個變量為 global全局變量。 那么函數(shù)里就可以直接使用了。 先講解下這個函數(shù)吧。 顧名思義這個函數(shù)是過濾字符竄里面的SQL語句使得關(guān)鍵的SQL語句單詞失效。
主要過濾那些SQL語句呢。 主要是這幾個關(guān)鍵字: union select update outfile or 等。因為這幾個SQL字是極度容易在$_GET傳輸中給截注.
這個函數(shù)寫得實在精妙。 is_array 來判斷 $string 是否為數(shù)組。如果 是 就 array_map() 函數(shù)來遞歸過濾
當(dāng)遞歸調(diào)用 strip_sql() 以后 is_array()判斷 $string 肯定為假了,因為$string已經(jīng)不是數(shù)組而是字符竄。所以 執(zhí)行 preg_replace()函數(shù)。這個函數(shù)很好理解了。就是替換了。
這個函數(shù)的作用就是把$_POST中的內(nèi)容用一個strip_sql的方法來處理,
**/
$_POST = strip_sql($_POST);
$_GET = strip_sql($_GET);
$_COOKIE = strip_sql($_COOKIE);
/**
使用strip_sql()函數(shù)來過濾 $_POST $_GET $_COOKIE;
一般不是開源的站。很少過SQL關(guān)鍵字過濾。不過這個也是冒很大風(fēng)險的。
來說一下strip_sql這個函數(shù),它和里邊的array_map函數(shù)一起實現(xiàn)了這個函數(shù)的遞歸調(diào)用,以來實現(xiàn)字符的替換。
**/
unset($search_arr, $replace_arr);
/**
unset 使用過但以后不需要的變量。這個是很好的習(xí)慣。第一不會浪費內(nèi)存。如果變量存了大量的數(shù)據(jù)字節(jié),而后你的程序是一直不需要用的。那么
就會很浪費內(nèi)存。拉底程序性能 . 哈哈。真很書面。反正是好習(xí)慣我們都要學(xué)習(xí)的拉。
*/
$magic_quotes_gpc = get_magic_quotes_gpc(); // get_magic_quotes_gpc()檢測gpc是否系統(tǒng)自動轉(zhuǎn)意。 gpc 是什么呢? GET POST COOKIE 來來去去就這幾個東西羅。會返回 真或假
if(!$magic_quotes_gpc)
{
$_POST = new_addslashes($_POST);
$_GET = new_addslashes($_GET);
}
/**
判斷一下系統(tǒng)是否打開了自動對gpc進(jìn)行轉(zhuǎn)意這個選擇。如果是的話,就不需要我們自動轉(zhuǎn)意了。如果不是那么還是要老百姓的手段。自己動手豐衣足食。
來看下也是在global.func.php 文件里面定義的這個函數(shù): 其實是一個封裝好的php的 addslashes() 函數(shù)的函數(shù)。PHP都自己有了為什么還要自己封裝成函數(shù)呢?
理由很簡單。為了以后的擴(kuò)展更改容易羅。如果我們一開始就全部用 addslashes() 這個函數(shù)來對 ' 進(jìn)行轉(zhuǎn)意的話。那么以后隨著程序的發(fā)展。我可能想多過濾個 ^ * ( )之類的
那如何是好呢?所以為了以后孩子的成長。我們還是最好封起來吧。 記住:以后有可能會邊的東西。最好都封裝成模塊。函數(shù) 。類。 這樣程序的靈活度就上去了。下面我們就來品一下
這個函數(shù)。
function new_addslashes($string)
{
if(!is_array($string)) return addslashes($string);
foreach($string as $key => $val) $string[$key] = new_addslashes($val);
return $string;
}
首先判斷是不是數(shù)組,如果不是那么把該值用作addslashes()的參數(shù),進(jìn)行轉(zhuǎn)意,并返回。
如果是數(shù)組那么一次取出該數(shù)組中的值來讓它轉(zhuǎn)意。
這個函數(shù)也是寫得賊好。也是同時考慮過濾 字符竄或數(shù)組,也是使用了 傳歸。看下就應(yīng)該明白了吧。這個不用說了。我們要學(xué)下這個思路這個方法方式哦。這樣才能進(jìn)
*/
posted on 2008-12-10 00:19 丁克設(shè)計 閱讀(428) 評論(0) 編輯 收藏 所屬分類: PHPCMS整站代碼講解