phpcms 源碼分析一: common.inc.php

    其實就是從網上找到的的逆雪寒的分析, 我下來以後發現格式和錯字的問題,很是影響閱讀,如今我就是作了下搬運工的角色, 同時將格式調整到可讀性提升點而已,讓各位看官稍微舒心點;php

  下面進入總體:html

  

  1 <?php
  2         /*
  3         國內著名CMS: PHPCMS 整站代碼分析講解 -2008-1-2已更新(# 20頁)(第三章繼續進行中..)
  4         CMS, 著名, 代碼, 講解
  5         本帖最後由 逆雪寒 於 2010-2-20 17:21 編輯 
  6         
  7         謝謝.  代碼講解分析所有是本人.按照本人的知識水平來說解.若是有說得不對的.請指正.也歡迎指正.你們一塊兒進步.謝謝
  8         
  9         但願你們支持哦  
 10         
 11         首先我對 PHPCMS 的 頭程序文件開始講解 : include/common.inc.php   這個文件是程序啓動的核心文件.
 12         
 13         
 14         /*
 15         代碼講解分析: 逆雪寒. 2007 - 12 - 20 
 16         */
 17 
 18 
 19         /*
 20          計算腳本開始運行的時間。很常見的寫法。最後結算還在程序運行的終點位置。講到了在給各位說。
 21         */
 22         $mtime = explode(' ', microtime());  
 23         
 24         $phpcms_starttime = $mtime[1] + $mtime[0];
 25         
 26         /*
 27          把  $HTTP_ENV_VARS $HTTP_POST_VARS 全局變量設置爲 NULL  由於php4.1.0以上默認以 $_POST 來替代。
 28         unset後防止程序運行在低版本會出現安全等問題。好比變量注入
 29         */
 30         
 31         unset($LANG, $_REQUEST, $HTTP_ENV_VARS, $HTTP_POST_VARS, 
 32               $HTTP_GET_VARS, $HTTP_POST_FILES, $HTTP_COOKIE_VARS);
 33 
 34         /*
 35          * 地球人都知道。關了字符串入庫自動轉意 好比  my name is on'x     轉成  my name is on \'x
 36          * 爲了最大的程序性能因此咱們關掉吧~哈哈
 37          */
 38         set_magic_quotes_runtime(0); 
 39         
 40         /*
 41          程序入口標記。爲何須要這個東西呢。就比如你進一個小區,保安大哥哥確定要你簽字或是掛個鳥牌證實你是從正門進來的。
 42         防止你FQ進入去偷東西搞破壞。這個入口標記也有這個功能。 在這裏定義了一個常量 IN_PHPCMS 爲 TRUE ,
 43         而後我在其餘程序文件裏面檢查這個標記。若是不存在或不爲真,
 44         那麼就基本能夠確定你這個傢伙是個小偷來的。 人可能FQ進入。但程序怎麼FQ呢。
 45         只要在php.ini文件裏面激活 allow_url_fopen選項,include() 就能夠包含 URL 地址了。
 46         你想下若是你有個 放密碼的PHP文件。若是給人家include 了之後。你怕不怕。
 47         */
 48 
 49         
 50         /*
 51          爲了程序產品的跨平臺。自動獲取程序的安裝目錄路徑 ,定義爲 PHPCMS_ROOT 常量。方便之後程序使用。建議你們都這樣作哦
 52         */
 53         
 54         define('IN_PHPCMS', TRUE);
 55          
 56 
 57 
 58         /*
 59          包含 全局函數 global.func.php 文件。裏面放了些程序全局都有須要用的函數.你們看到了吧。  常量 PHPCMS_ROOT 已經發揮做用。
 60         這樣程序給人家發佈到了 二級目錄下。也不須要人家手動改整站根目錄路徑了。本身好好理解下。。。。。
 61         */
 62 
 63         require PHPCMS_ROOT.'/include/global.func.php';  
 64         
 65 
 66         // 如下關鍵字無視大小寫
 67         /*
 68          ("/ union /i")  這個是正則的寫法?不懂正則的本身百度找教程來學。 這裏不詳細說了
 69         */        
 70         $search_arr = array("/ union /i","/ select /i",
 71                 "/ update /i","/ outfile /i","/ or /i");
 72          
 73 
 74         /*
 75          看這個意思很明瞭。 union :鏈接兩條SQL語句。 outfile : 主要用來導出數據庫資料到其餘介質上。
 76         幹啥字要定義這兩個變量呢? 在 global.func.php 文件(前面已經加載)裏面有個函數 strip_sql() 各位能夠看下。
 77         */
 78         $replace_arr = array(' union ',' select ',' update ',' outfile ',' or ');
 79         
 80 
 81         /*
 82          函數裏面定義了這兩個變量爲 global全局變量。 那麼函數裏就能夠直接使用了。
 83         先講解下這個函數吧。 顧名思義這個函數是過濾字符串裏面的SQL語句使得關鍵的SQL語句單詞失效。
 84         主要過濾那些SQL語句呢。 主要是這幾個關鍵字: union  select  update outfile  or 等。
 85         由於這幾個SQL字是極度容易在$_GET傳輸中給截注.
 86         這個函數寫得實在精妙。  is_array 來判斷 $string 是否爲數組。
 87         若是 是  就 array_map() 函數來遞歸過濾 $string數組裏面的每個單元. 每一個單元是一個字符串吧?
 88         當遞歸調用 strip_sql() 之後 is_array()判斷 $string 確定爲假了,
 89         由於$string已經不是數組而是字符串。因此 執行 preg_replace()函數。這個函數很好理解了。就是替換了。
 90         */        
 91         function strip_sql($string)
 92         {
 93             global $search_arr,$replace_arr;
 94             return is_array($string) 
 95                  ? array_map('strip_sql', $string) 
 96                  : preg_replace($search_arr, $replace_arr, $string);
 97         }
 98         
 99         /*
100          使用strip_sql()函數來過濾 $_POST  $_GET   $_COOKIE;
101         通常不是開源的站。不多過SQL關鍵字過濾。不過這個也是冒很大風險的。
102         */
103 
104         $_POST = strip_sql($_POST);
105         
106         $_GET = strip_sql($_GET);
107         
108         $_COOKIE = strip_sql($_COOKIE);
109         
110 
111         /*
112          unset 使用過但之後不須要的變量。這個是很好的習慣。第一不會浪費內存。
113         若是變量存了大量的數據字節,然後你的程序是一直不須要用的。
114         那麼就會很浪費內存。拉底程序性能 . 哈哈。真很書面。反正是好習慣咱們都要學習的拉。
115         */
116         unset($search_arr, $replace_arr);
117         
118 
119 
120         // get_magic_quotes_gpc()檢測gpc是否系統自動轉意。 gpc 是什麼呢? 
121         // GET POST COOKIE 來來去去就這幾個東西羅。會返回 真或假
122         /*
123          判斷一下系統是否打開了自動對gpc進行轉意這個選擇。若是是的話,就不須要咱們自動轉意了。若是不是那麼仍是要老百姓的手段。本身動手豐衣足食。
124         來看下也是在global.func.php 文件裏面定義的這個函數: 實際上是一個封裝好的php的 addslashes() 函數的函數。
125         PHP都本身有了爲何還要本身封裝成函數呢?
126         理由很簡單。爲了之後的擴展更改容易羅。若是咱們一開始就所有用 addslashes() 這個函數來對 ' 進行轉意的話。
127         那麼之後隨着程序的發展。我可能想多過濾個 ^ * ( )之類的
128         那如何是好呢?因此爲了之後孩子的成長。咱們仍是最好封起來吧。
129         記住:之後有可能會邊的東西。最好都封裝成模塊。函數 。類。 這樣程序的靈活度就上去了。
130         */
131         $magic_quotes_gpc = get_magic_quotes_gpc();
132          
133         if(!$magic_quotes_gpc)
134         {
135             $_POST = new_addslashes($_POST);
136             
137             $_GET = new_addslashes($_GET);
138         }
139         
140 
141         /*
142          這個函數也是寫得賊好。也是同時考慮過濾 字符串或數組,也是使用了 遞歸。
143         看下就應該明白了吧。這個不用說了。咱們要學下這個思路這個方法方式哦。
144         這樣才能進步。哈哈。咱們要懂模仿。
145         */
146         
147         function new_addslashes($string)
148         {
149             if(!is_array($string)) { 
150                 return addslashes($string);
151             }
152             
153             foreach($string as $key => $val) {
154                 $string[$key] = new_addslashes($val);
155             }
156             
157             return $string;
158         }
159         
160         /*
161          嘿。 extract 前面加個 @雞蛋作什麼呢??抑制錯誤的。還不懂的話。本身百度了。
162         爲何用extract()函數呢.  平時咱們程序 是否是要常使用 $_POST  $_GET來獲取傳遞的變量呀。是否是感受賊麻煩呀。
163         好比 $_POST['xx']  這樣接受是挺好。但寫多了很麻煩是吧。我是感受麻煩。我如今想直接就 $xx就能夠獲取傳遞過來的東西。
164         那怎麼辦呢。就用了 extract()函數來實現這麼一個技巧。 這個技巧在discuz 論壇上也有應用。
165         */
166         
167         @extract($_POST, EXTR_OVERWRITE); // EXTR_OVERWRITE - 默認。若是有衝突,則覆蓋已有的變量。
168         
169         @extract($_GET, EXTR_OVERWRITE);
170 
171         /*
172          unset() 好處不用說了吧。 釋放 $_POST $_GET 數組 ,由於已經不須要他們了。
173         */
174         unset($_POST, $_GET);
175         
176 ?>
相關文章
相關標籤/搜索