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