修改global.func.php,DZ论坛核心代码分析-核心文件global.func.php篇
用了两天时间才把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更新附件包将此注释加入
修改global.func.php,DZ论坛核心代码分析-核心文件global.func.php篇相关推荐
- Rime输入法核心代码分析——WeaselServer文件夹网络化分析(四)
2021SC@SDUSC 在之前的文章中,我们对Weasel输入法的总体结构和相关的头文件WeaselIPC.h进行了分析,接下来我们将从WeaselServer.cpp开始,对于代码的其他部分进行具 ...
- Java 线程池框架核心代码分析
转载自 Java 线程池框架核心代码分析 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executo ...
- 关于《机器学习实战》中创建决策树的核心代码分析
关于<机器学习实战>中创建决策树的核心代码分析 SIAT nyk 2017年10月21日星期六 一.源码内容 def create ...
- 微信公众号抢现金红包活动的核心代码分析(asp.net C#)
今年春节微信抢红包,我想各位都还记得.最近很多商家也在使用公众号给粉丝发红包,做营销活动.吸粉活动或者是反馈老用户等. 我们作为第3方开发者,就义不容辞的来给这些商家服务了.首先我们得会使用程序来写抢 ...
- 【Android 性能优化】应用启动优化 ( Trace 文件分析 | 结合代码分析 Trace 文件 )
文章目录 一. Trace 文件查看 二. 结合代码分析 Trace 文件 一. Trace 文件查看 上一篇博客 [Android 性能优化]应用启动优化 ( 方法追踪代码模板 | 示例项目 | S ...
- DZ X2.5 由本地上传到网站空间时要修改的配置文件。dz论坛 BBS首页模板位置。Discuz!X/数据库字典
DZ X2.5 由本地上传到网站空间时要修改的配置文件 uc_server/data/config.inc.php config/config_global.php config/config_uce ...
- java 测试用例核心代码_核心Java测验
java 测试用例核心代码 Welcome to Core Java Quiz. Java is an object-oriented programming language. 欢迎来到Core J ...
- php代码分析,THINKPHP代码分析核心.pdf
前言 TP 的手册相当多,其实不必再出这样的贴子,论技术,我也是菜鸟一个,同时也在学 习当中.看到论坛上多了不少新朋友,不少在抱怨手册看不懂,那我就姑且抛砖引玉,尝试 与新朋友们更简单地.手把手地进入 ...
- Leaf(美团分布式ID生成服务)核心代码分析
上一篇文章我们讲了几种常见的分布式唯一ID生成方案,今天我们再来讲一下由美团开源的Leaf框架,这个框架集成了两种最适合生产环境使用的方式 第一种方式是:Leaf Segment 这种方式其实跟我们之 ...
最新文章
- android 7.0拷贝文件,Android 7.0应用间共享文件----FileProvider
- ubuntu 关闭qq打不开的终极方法
- Linux中命令添加路由
- web前端自学入门视频教程分享
- GPU Gems1 - 8 衍射的模拟
- java基础知识——面向对象基本概念
- java的调试页面_[Java教程]使用开发者工具调试jsp页面中的脚本
- 华为已经升级鸿蒙系统的机型,鸿蒙系统名单已确认!覆盖55款机型,这些手机将被淘汰!...
- access设计视图打不开_铁路桥梁BIM程序的设计与实现
- 返回的图片 buffer 怎么接收_面试题:Kafka 会不会丢消息?怎么处理的?
- 关于hive和spark日志问题
- TCP和UDP区别?如何改进TCP
- sql2012官网下载地址
- 在超市使用室内地图的5个好处
- MySQL登录出错:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
- 纹宁指纹支持谷歌浏览器指纹采集和指纹比对
- 【牛客网】马三来刷题之串的模式匹配
- 【Flex】“安装的AdobeFlashPlayer不是调试器”解决办法之详解
- adbdriver的安装
- Silverlight C# 游戏开发:草动系统(一)简单的草动
热门文章
- Jenkins+Gitlab+Ansible自动化部署(四)
- 计算机组成原理---32位的CPU64位CPU与32位os64os的区别与联系
- html文件能放病毒吗,防火墙能防病毒吗?
- virtualbox和Hyperv
- 全球与中国云监控软件市场深度研究分析报告(2021)
- win10关机后cpu风扇还在转_解决win10关机后风扇继续转方法
- 物联网开发笔记(38)- 使用Micropython开发ESP32开发板之控制温度传感器(DS18B20)
- Mac日历显示节假日和调休订阅URL
- android system.err 是什么意思,android – java.lang.IllegalStateException是什么意思?
- 计算机组成原理实验存储器部件实验,实验4存储器部件实验.doc