欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

DZ论坛核心代码分析-核心文件global.func.php篇

程序员文章站 2024-01-24 17:52:10
...
请看上一篇:DZ论坛核心代码分析计划--install包篇

用了两天时间才把global.func.php分析完。还打算3天把common.inc.php文件整完,发现又分出来很多文件。所以这一次帖子改变一下策略。先上global.func.php文件的分析吧。。分析得不好。很多东西我没搞明白到底干嘛用的。。。甚至发现几个在整个DZ的文件系统中都没引用的函数。可能是测试函数吧。不过挺好用的。自己拿了放自己的函数包里了。
因为这个包代码很多。只把个人重要的仔细分析了每个代码块。
在上一个文分析计划里,我其实少上两个文件,一个是DZ论坛全局变量申明表。DZ论坛文件作用表。DZ论坛函数调用处表。
因为分析的东西暂时比较少,所以没有上上来。等全部搞完再说吧。
学习日记如下:

只更新一部分。。。。还有另一部分。。下午更新上来

以下为引用的内容:
Golbal.func.php
日记时间:2008年10月7日10:37:34
1、 这个文件是常被引用的文件,所以开头还是采用了惯用的常量判断法。防止被恶意浏览器直接打开
2、 加密函数authcode中的加密有多次的md5叠加加密。保证密码的安全性。在常有的思维中,一般是只加密了一次。而在DZ的加密函数中。加密算法很复杂。分别从md5加密,字符随机截断加密,位运算加密和与密匙结合加密。
3、 DZ的字符处理工作非常好。虽然在下载的时候我们会选择utf-8还是gbk。但是不管是处理字符还是处理数据库链接的时候都是第一考虑字符编码的地方。在db_mysql.class.php文件的数据库链接上就判断了格式是什么。代码如下
$func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect';

//建立一个链接给类的属性link之中。并且在建立链接的时候就设定编码方式是如何的。

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就是用来设定编码格式的。Cutstr里根据这个变量的值来对字符串进行处理。
另,在cutstr()函数里,在进行截断之前会将字符串中的特殊字符进行处理。


$string = str_replace(array('&', '"', ''), array('&', '"', ''), $string);


在处理截断之后,再将其还原。


$strcut = str_replace(array('&', '"', ''), array('&', '"', ''), $strcut);
这就能解释为什么DZ论坛截断后的文字依然符合原有的文字格式。
4、 对html代码格式自定义替换。但这里要注意一下DZ考虑得很周到。

if(is_array($string)) {

foreach($string as $key => $val) {

$string[$key] = dhtmlspecialchars($val);//如果是数租,遍历数组再调用自身的这个函数对单个字符处理。

}
判断如果传入的字符串是数组呢?恩。按我的想法是,只封装字符的替换部分。但他这里封装得很好。因为我在调用这个函数的时候就不用担心我传递的是什么格式的字符串了。
5、 将页面跳转封装在了dheader函数里
6、//典型的减少代码重复输入函数。处理好email字符串。只需要emailconv(email地址)就能返回一个已经编码好的email地址了
function emailconv($email, $tolink = 1) {

$email = str_replace(array('@', '.'), array('@', '.'), $email);

return $tolink ? ''.$email.'': $email;
}
7、//对文件名进行截断处理,输入文件名,返回处理后的文件名
function fileext($filename) {

return trim(substr(strrchr($filename, '.'), 1, 10));
}
8、 DZ处理浏览器直接输入路径访问问题是用的判断常量法。但是机器人呢?机器人可没常量。但是php有和自定义常量:$_SERVER['HTTP_USER_AGENT']。这两个是用来判断机器人的名称的。里面还包含了名字。于是机器人的判断法如下:
//通过分析调用这个函数的common.inc.php文件。这个函数是用来判断对机器人的处理方式的。
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这个常量为假。反之则判断蜘蛛是不是上述已经定义好的搜索引擎,如果是则定义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文件里调用是这样处理的:
//通过这个常量,不允许机器人随意访问这个页面。
define('IS_ROBOT', getrobot());
if(defined('NOROBOT') && IS_ROBOT) {

exit(header("HTTP/1.1 403 Forbidden"));
}
看回来还是常量法。只是这个常量的值是通过函数getrobot()获取的。

更新错误:这些错误是我分析在其调用的地方得知的错误。但不可能我发现一点改一点,所以在这里说明
以下为引用的内容:
checklowerlimit():这个函数是用来检查积分限制的

谢谢下面这些人的帮助

以下为引用的内容:
dongxin1390008说:daddslashes函数是检查php.ini文件的'MAGIC_QUOTES_GPC选项是否打开,若这个关闭,很容易的可以进行sql注射,若关闭了,则使用addslashes对单引号,# 号进行转义 2008-10-6 17:33:30更新附件包将此注释加入