請看上一篇:DZ論壇核心代碼分析計(jì)劃--install包篇
用了兩天時間才把global.func.php分析完。還打算3天把common.inc.php文件整完,發(fā)現(xiàn)又分出來很多文件。所以這一次帖子改變一下策略。先上global.func.php文件的分析吧。。分析得不好。很多東西我沒搞明白到底干嘛用的。。。甚至發(fā)現(xiàn)幾個在整個DZ的文件系統(tǒng)中都沒引用的函數(shù)。可能是測試函數(shù)吧。不過挺好用的。自己拿了放自己的函數(shù)包里了。
因?yàn)檫@個包代碼很多。只把個人重要的仔細(xì)分析了每個代碼塊。
在上一個文分析計(jì)劃里,我其實(shí)少上兩個文件,一個是DZ論壇全局變量申明表。DZ論壇文件作用表。DZ論壇函數(shù)調(diào)用處表。
因?yàn)榉治龅臇|西暫時比較少,所以沒有上上來。等全部搞完再說吧。
學(xué)習(xí)日記如下:
只更新一部分。。。。還有另一部分。。下午更新上來
以下為引用的內(nèi)容: Golbal.func.php 日記時間:2008年10月7日10:37:34 1、 這個文件是常被引用的文件,所以開頭還是采用了慣用的常量判斷法。防止被惡意瀏覽器直接打開 2、 加密函數(shù)authcode中的加密有多次的md5疊加加密。保證密碼的安全性。在常有的思維中,一般是只加密了一次。而在DZ的加密函數(shù)中。加密算法很復(fù)雜。分別從md5加密,字符隨機(jī)截?cái)嗉用埽贿\(yùn)算加密和與密匙結(jié)合加密。 3、 DZ的字符處理工作非常好。雖然在下載的時候我們會選擇utf-8還是gbk。但是不管是處理字符還是處理數(shù)據(jù)庫鏈接的時候都是第一考慮字符編碼的地方。在db_mysql.class.php文件的數(shù)據(jù)庫鏈接上就判斷了格式是什么。代碼如下 $func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect'; //建立一個鏈接給類的屬性link之中。并且在建立鏈接的時候就設(shè)定編碼方式是如何的。 if(!$this->link = @$func($dbhost, $dbuser, $dbpw, 1)) { $halt && $this->halt('Can not connect to MySQL server'); } else { if($this->version() > '4.1') { global $charset, $dbcharset; $dbcharset = $dbcharset2 ? $dbcharset2 : $dbcharset; $dbcharset = !$dbcharset && in_array(strtolower($charset), array('gbk', 'big5', 'utf-8')) ? str_replace('-', '', $charset) : $dbcharset; $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : ''; $serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=''') : ''; $serverset && mysql_query("SET $serverset", $this->link); } 再在global.func.php文件中的字符串處理也是考慮了字符串的編碼格式問題的。 有個全局變量$charset就是用來設(shè)定編碼格式的。Cutstr里根據(jù)這個變量的值來對字符串進(jìn)行處理。 另,在cutstr()函數(shù)里,在進(jìn)行截?cái)嘀皶⒆址械奶厥庾址M(jìn)行處理。 $string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string); 在處理截?cái)嘀螅賹⑵溥€原。 $strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut); 這就能解釋為什么DZ論壇截?cái)嗪蟮奈淖忠廊环显械奈淖指袷健?br />4、 對html代碼格式自定義替換。但這里要注意一下DZ考慮得很周到。 if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = dhtmlspecialchars($val);//如果是數(shù)租,遍歷數(shù)組再調(diào)用自身的這個函數(shù)對單個字符處理。 } 判斷如果傳入的字符串是數(shù)組呢?恩。按我的想法是,只封裝字符的替換部分。但他這里封裝得很好。因?yàn)槲以谡{(diào)用這個函數(shù)的時候就不用擔(dān)心我傳遞的是什么格式的字符串了。 5、 將頁面跳轉(zhuǎn)封裝在了dheader函數(shù)里 6、//典型的減少代碼重復(fù)輸入函數(shù)。處理好email字符串。只需要emailconv(email地址)就能返回一個已經(jīng)編碼好的email地址了 function emailconv($email, $tolink = 1) { $email = str_replace(array('@', '.'), array('@', '.'), $email); return $tolink ? '<a href="mailto: '.$email.'">'.$email.'</a>': $email; } 7、//對文件名進(jìn)行截?cái)嗵幚?,輸入文件名,返回處理后的文件?br />function fileext($filename) { return trim(substr(strrchr($filename, '.'), 1, 10)); } 8、 DZ處理瀏覽器直接輸入路徑訪問問題是用的判斷常量法。但是機(jī)器人呢?機(jī)器人可沒常量。但是php有和自定義常量:$_SERVER['HTTP_USER_AGENT']。這兩個是用來判斷機(jī)器人的名稱的。里面還包含了名字。于是機(jī)器人的判斷法如下: //通過分析調(diào)用這個函數(shù)的common.inc.php文件。這個函數(shù)是用來判斷對機(jī)器人的處理方式的。 function getrobot() { if(!defined('IS_ROBOT')) { //定義搜索引擎名 $kw_spiders = 'Bot|Crawl|Spider|slurp|sohu-search|lycos|robozilla'; //定義瀏覽器種類名 $kw_browsers = 'MSIE|Netscape|Opera|Konqueror|Mozilla'; //判斷是否是這些瀏覽器,如果是,則定義IS_ROBOT這個常量為假。反之則判斷蜘蛛是不是上述已經(jīng)定義好的搜索引擎,如果是則定義IS_ROBOT這個常量為真。如果都不滿足條件,定義IS_ROBOT這個常量為假。 if(preg_match("/($kw_browsers)/i", $_SERVER['HTTP_USER_AGENT'])) { define('IS_ROBOT', FALSE); } elseif(preg_match("/($kw_spiders)/i", $_SERVER['HTTP_USER_AGENT'])) { define('IS_ROBOT', TRUE); } else { define('IS_ROBOT', FALSE); } } //返回IS_ROBOT這個常量的值 return IS_ROBOT; } 在common.inc.php文件里調(diào)用是這樣處理的: //通過這個常量,不允許機(jī)器人隨意訪問這個頁面。 define('IS_ROBOT', getrobot()); if(defined('NOROBOT') && IS_ROBOT) { exit(header("HTTP/1.1 403 Forbidden")); } 看回來還是常量法。只是這個常量的值是通過函數(shù)getrobot()獲取的。 |
以下為引用的內(nèi)容:
checklowerlimit():這個函數(shù)是用來檢查積分限制的
謝謝下面這些人的幫助
以下為引用的內(nèi)容:dongxin1390008說:daddslashes函數(shù)是檢查php.ini文件的'MAGIC_QUOTES_GPC選項(xiàng)是否打開,若這個關(guān)閉,很容易的可以進(jìn)行sql注射,若關(guān)閉了,則使用addslashes對單引號,# 號進(jìn)行轉(zhuǎn)義 2008-10-6 17:33:30更新附件包將此注釋加入 |