修改global.func.php,DZ论坛核心代码分析-核心文件global.func.php篇_PHP教程

以下为引用的内容:

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()获取的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值