dedecms源码分析之common.inc.php页面(2014/4/8)

对于common.inc.php这个页面其实是公共文件库。里面可以有配置参数,有详细功能的类库,有进行公有化参数。而且每个文件都直接或间接引用了这个文件。当涉及到安全问题时。比如a能防住某项攻击。那么我们把a放在index的第一行,就能防住从index进入。但如果黑客们从其他的页面进入呢。这个时候,因为如果每个需要数据处理的页面都在第一行包含了common.inc.php我们把a放在common.inc.php的第一行,也就防住了这项攻击。 


附上详细注释,供日后复习!代码用灰色标出,思考用红色标出。留待日后用蓝色。知识点用绿色标出

// 报错级别设定,一般在开发环境中用E_ALL,这样能够看到所有错误提示

// 系统正常运行后,直接设定为E_ALL || ~E_NOTICE,取消错误显示

// error_reporting(E_ALL);

error_reporting(E_ALL || ~E_NOTICE);

/**知识点:

 * define(a,b,c); 意思是定一个常量a,值为b,c为false和true,代表是否对大小写敏刚。

 * str_replace(a,b,c,d); 意思是在c中找到a,用b代替。d为对替换进行计数。

 * __FILE__代表当前代码所在文件的完整路径。(JiaPeng/include/common.inc.php)dirname(__FILE__)是当前代码文件所在文件夹的完整路径。dirname(dirname(__FILE__));代指前面文件夹的上一层。类似于../的用法。

 * substr(a,b,c);返回a字符串中的部分字符串。从b处开始,返回的长度为c。b为负,从字符串的结尾开始算指定位置。c为负则从字符串的末端开始返回。

 * 思考1:

 * 注意第一个//用的是双引号,\用的是单引号。思考//中是不是第一个/为转义字符?

 * 注释:

 * 第一句的作用就是,先在当前代码文件所在目录的完整路径中检查是否有\\这样不正确的格式,有的话用/代替。这样得出一个完整的正确的路径,并且由于代码是我们布置的,用这样的

 * 方法可以解决代码放在不同文件夹里面的路径问题。这样最后得出一个路径,并赋值给DEDEINC这个常量。以后要用到这个路径直接引用DEDEINC即可。

 * 第二句的作用就是,把DEDEINC进行返回,其实返回的是JiaPeng/      并把这个值赋给DEDEROOT常量。

 * 第三句的作用就是,把JiaPeng/data赋值给DEDEDATA常量。

 * 第四句的作用就是,把JiaPeng/templets赋值给DEDETEMPLATE常量。这个目录是模板目录。就是前端的存放目录。

 */

define('DEDEINC', str_replace("\\", '/', dirname(__FILE__)));

define('DEDEROOT', str_replace("\\", '/', substr(DEDEINC, 0, -8)));

define('DEDEDATA', DEDEROOT . '/data');

define('DEDEMEMBER', DEDEROOT . '/member');

define('DEDETEMPLATE', DEDEROOT . '/templets');

/**

 * 注释:定义常量DEDEMODEL='./model' 我猜测这个意思就是,用常量代指一个文件夹目录。以后他的上级目录不管怎么变,都能得到我们想要的    ./表示当前目录下的文件。

 */

// ------------------------------------------------------------------------

define('DEDEMODEL', './model');

define('DEDECONTROL', './control');

define('DEDEAPPTPL', './templates');


define('DEBUG_LEVEL', FALSE);

/**

 * 知识点:

 * version_compare表示对比两个php版本数字字符串。有助于编写仅能兼容某些版本的php程序。

 * version_compare(a,b,c);a为第一个版本,b为第二个版本。c为比较操作符。a c b

 * 如果没有写c,则有默认的比较方式。a<b时返回-1。a=b时返回0。a大于b时返回1。

 * set_magic_quotes_runtime() 当设置为1时作用是把一些特殊的字符写入到数据库中。如\" ,等。这样就能解决特殊字符提交数据库时显示错误。

 * strtoupper();将字符串转换为大写。

 * ini_get();返回php.ini里面环境变量的值。如果里面是布尔型,则返回0或1;如果想获取整个php.ini里的变量值。可以用它的加强函数ini_get_all();来以数组的方式返回整个php的环境变量。

 * function_exists();在调用某个函数之前可以用它先检测一下,那个函数是否存在。以加强php的健壮性。

 * session_register()的用法,session_register('var');$var='abc';相当于session_register('abc');而且当更改$var后,session_register('var');里面的值也不会改变。很麻烦,所以一般不用

 * func_get_args() 返回当前函数所有参数的一个数组。

 * *注释:

 * 第一个if语句,当版本小于5.3.0时取消了把特殊字符写入数据库

 * 第二个if语句,获取php.ini里的环境变量配置。转化为大写后判断是否等于 C

 * 第三个if语句,这里的session_register()和上面说的那个并不一样。这个是自定义的。不懂这段代码的功能作用???总感觉这段代码写的有问题。应该是foreach($args as $key=>$value)

 * 不过总的来说,三个if语句,是判断我们php的版本。dedecms来做相应的响应。

 */

if (version_compare(PHP_VERSION, '5.3.0', '<')) {

    set_magic_quotes_runtime(0);

}


if (version_compare(PHP_VERSION, '5.3.0', '>')) {

    if (strtoupper(ini_get('request_order')) == 'C')

        exit('DedeCMS Error: (PHP 5.3 and above) Please set \'request_order\' ini value to include C,G and P (recommended: \'CGP\') in php.ini,<a href="http://help.dedecms.com/install-use/apply/2013/0715/2325.html" target="_blank">more...</a>');

}


if (version_compare(PHP_VERSION, '5.4.0', '>=')) {

    if (!function_exists('session_register')) {


        function session_register() {

            $args = func_get_args();

            foreach ($args as $key) {

                $_SESSION[$key] = $GLOBALS[$key];

            }

        }


        function session_is_registered($key) {

            return isset($_SESSION[$key]);

        }


        function session_unregister($key) {

            unset($_SESSION[$key]);

        }


    }

}

/**

 * 注释:先让$cfg_is_mb 和$cfg_is_iconv 初始化为FALSE,再根据两个函数是否存在来确定这两个变量的bool值。PHP6.0中get_magic_quotes_gpc已经被取消了。

 */

//是否启用mb_substr替换cn_substr来提高效率

$cfg_is_mb = $cfg_is_iconv = FALSE;

if (function_exists('mb_substr'))

    $cfg_is_mb = TRUE;

if (function_exists('iconv_substr'))

    $cfg_is_iconv = TRUE;


function _RunMagicQuotes(&$svar) {

    if (!get_magic_quotes_gpc()) {

        if (is_array($svar)) {

            foreach ($svar as $_k => $_v)

                $svar[$_k] = _RunMagicQuotes($_v);

        } else {

            if (strlen($svar) > 0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#', $svar)) {

                exit('Request var not allow!');

            }

            $svar = addslashes($svar);

        }

    }

    return $svar;

}

/**

 * 知识点:

 * is_array();检查变量是否是数组。

 * preg_match(a,b);执行一个正则表达式匹配。按照a规则在b中找到相匹配的。

 * $a=1;$b=&$a;这里的意思其实就是,定义的$b的内存已经和a的一样了。当改变b时,a也会变。当改变a时,b也会变。学名叫做函数的传址调用

 * 

 * 

 * 注释:

 * 当传入一个变量后,$val已经指向了变量的内存块。遍历它,看看有没有'nvarname'这个键值。后面两句CheckRequest基本

 * 

 * 

 */

if (!defined('DEDEREQUEST')) {


    //检查和注册外部提交的变量   (2011.8.10 修改登录时相关过滤)

    function CheckRequest(&$val) {

        if (is_array($val)) {

            foreach ($val as $_k => $_v) {

                if ($_k == 'nvarname')

                    continue;

                CheckRequest($_k);

                CheckRequest($val[$_k]);

            }

        } else {

            if (strlen($val) > 0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#', $val)) {

                exit('Request var not allow!');

            }

        }

    }


     //当用户用url提交了一个变量时,$_REQUEST可以获取post和get提交的变量。把这个变量提交给CheckRequest();函数。

    CheckRequest($_REQUEST);

/**

 * 

 */

    foreach (Array('_GET', '_POST', '_COOKIE') as $_request) {

        foreach ($$_request as $_k => $_v) {

            if ($_k == 'nvarname')

                ${$_k} = $_v;

            else

                ${$_k} = _RunMagicQuotes($_v);

        }

    }

}


//系统相关变量检测

if (!isset($needFilter)) {

    $needFilter = false;

}

$registerGlobals = @ini_get("register_globals");

$isUrlOpen = @ini_get("allow_url_fopen");

$isSafeMode = @ini_get("safe_mode");

if (preg_match('/windows/i', @getenv('OS'))) {

    $isSafeMode = false;

}

/**知识点:

 * is_writeable();判断指定的文件是否可以写。is_readable 判断指定的文件是否可以读。

 * session.save_path对于files处理器,此值是创建会话数据文件的路径。

 * 注释:

 * 我们在设计中肯定要用到session,故需要设置session的保存路径。

 * 思考2:

 * 1、这样说的话,这个文件里面的东西,是不是就都是我们设计时要用到的那些东西的配置,比如:保存路径啊,php的版本啊。常用的一些路径什么的定义成常量。登录注册的检测信息。等等。同样,我们是不是可以推测出,这里定义的一些的东西,基本上就涵盖了dedecms这款系统大部分的功能,窥一斑而知全豹。

 *2、在php文件路径中 ./  /分别代表什么意思? “”  ‘’  又有什么区别?

 * 

 * */

//Session保存路径

$sessSavePath = DEDEDATA . "/sessions/";

if (is_writeable($sessSavePath) && is_readable($sessSavePath)) {

    session_save_path($sessSavePath);

}

/**

 * 注释:

 * 把DEDECMS的系统配置参数文件包含进来。这个配置文件是数据库里面的配置信息的缓存。

 */

//系统配置参数

require_once(DEDEDATA . "/config.cache.inc.php");

/**

 * 注释:

 * 如果是文件类型,包含上传文件的规则文件。

 * 思考:

 * if($_FILES)中$_FILES是上传的文件相关的变量。

 */

//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数

if ($_FILES) {

    require_once(DEDEINC . '/uploadsafe.inc.php');

}

/**

 * 注释:

 * 这个数据库配置文件,不是上面的缓存,而是我们安装时根据我们所填的信息。自动生成的数据库配置。

 * 里面包含了数据库的连接配置

 */

//数据库配置文件

require_once(DEDEDATA . '/common.inc.php');


/**知识点:

 * serialize();把一个实例化的对象转化成一个字符串。$p=new a();$p1=serialize($p);当这个实例化的对象被删除以后。

 * 用unserialize();又可以把这个对象还原。$p2=unserialize($p1);$p2-> getname(); getname()是$p对象里面的方法。

 * 注释:调用安全配置文件,

 */

//载入系统验证安全配置

if (file_exists(DEDEDATA . '/safe/inc_safe_config.php')) {

    require_once(DEDEDATA . '/safe/inc_safe_config.php');

    if (!empty($safe_faqs))

        $safefaqs = unserialize($safe_faqs);

}

/**知识点:

 * @session_set_cookie_params不知道什么意思?

 * 注释:

 */

//Session跨域设置

if (!empty($cfg_domain_cookie)) {

    @session_set_cookie_params(0, '/', $cfg_domain_cookie);

}

/**知识点:

 * data_default_timezone_set('PRC');设置时区的函数。PRC表示中华人民共和国The People`s Republic of China

 * 

 * 注释:????????

 * 写的我看不懂。个人感觉可以这样写:

 * if(PHP_VERSION > '5.1'){

 * data_default_timezone_set('PRC');}

 */

//php5.1版本以上时区设置

//由于这个函数对于是php5.1以下版本并无意义,因此实际上的时间调用,应该用MyDate函数调用

if (PHP_VERSION > '5.1') {

    $time51 = $cfg_cli_time * -1;

    @date_default_timezone_set('Etc/GMT' . $time51);

}

$cfg_isUrlOpen = @ini_get("allow_url_fopen");


//用户访问的网站host

$cfg_clihost = 'http://' . $_SERVER['HTTP_HOST'];

/**知识点:

 * preg_replace('a','b','c');在c中所有匹配a正则式的以b代替。

 * 注释:

 * 思考3:

 * '#' . $cfg_cmspath . '\/include$#i' 这也是正则表达式?

 * 这里突然有好多变量,如:$cfg_cmspath ,$cfg_multi_site,$cfg_mainsite ,$cfg_basehost这些都是在哪里定义的。我知道php中变量要用的时候,直接定义即可

 * 但像这里$cfg_mainsite = $cfg_basehost;$cfg_basehost总也要有个出处吧!难道是把变量在这里定义。在以后的地方引用?留待日后。。。

 */

//站点根目录

$cfg_basedir = preg_replace('#' . $cfg_cmspath . '\/include$#i', '', DEDEINC);

if ($cfg_multi_site == 'Y') {

    $cfg_mainsite = $cfg_basehost;

} else {

    $cfg_mainsite = '';

}

/**

 * 思考4:

 * 姑且猜测在本地上面。$cfg_cmspath=JiaPeng/

 * 像本地啊,模板啊。上面不是已经定义了一些常量吗。下面又来重新定义。留待日后,看看是我不懂,还是他乱写一通。???

 */

//模板的存放目录

$cfg_templets_dir = $cfg_cmspath . '/templets';

$cfg_templeturl = $cfg_mainsite . $cfg_templets_dir;

$cfg_templets_skin = empty($cfg_df_style) ? $cfg_mainsite . $cfg_templets_dir . "/default" : $cfg_mainsite . $cfg_templets_dir . "/$cfg_df_style";


//cms安装目录的网址

$cfg_cmsurl = $cfg_mainsite . $cfg_cmspath;


//插件目录,这个目录是用于存放计数器、投票、评论等程序的必要动态程序

$cfg_plus_dir = $cfg_cmspath . '/plus';

$cfg_phpurl = $cfg_mainsite . $cfg_plus_dir;


$cfg_data_dir = $cfg_cmspath . '/data';

$cfg_dataurl = $cfg_mainsite . $cfg_data_dir;


//会员目录

$cfg_member_dir = $cfg_cmspath . '/member';

$cfg_memberurl = $cfg_mainsite . $cfg_member_dir;


//专题列表的存放路径

$cfg_special = $cfg_cmspath . '/special';

$cfg_specialurl = $cfg_mainsite . $cfg_special;


//附件目录

$cfg_medias_dir = $cfg_cmspath . $cfg_medias_dir;

$cfg_mediasurl = $cfg_mainsite . $cfg_medias_dir;


//上传的普通图片的路径,建议按默认

$cfg_image_dir = $cfg_medias_dir . '/allimg';


//上传的缩略图

$ddcfg_image_dir = $cfg_medias_dir . '/litimg';


//用户投稿图片存放目录

$cfg_user_dir = $cfg_medias_dir . '/userup';


//上传的软件目录

$cfg_soft_dir = $cfg_medias_dir . '/soft';


//上传的多媒体文件目录

$cfg_other_medias = $cfg_medias_dir . '/media';


//软件摘要信息,****请不要删除本项**** 否则系统无法正确接收系统漏洞或升级信息

$cfg_version = '';

$cfg_soft_lang = 'utf-8';

$cfg_soft_public = 'base';


$cfg_softname = '星宇时空定制,嘉鹏影视后台管理系统';

$cfg_soft_enname = 'StarsPaces';

$cfg_soft_devteam = 'StarsPaces';


//文档的默认命名规则

$art_shortname = $cfg_df_ext = '.html';

$cfg_df_namerule = '{typedir}/{Y}/{M}{D}/{aid}' . $cfg_df_ext;


//新建目录的权限,如果你使用别的属性,本程不保证程序能顺利在Linux或Unix系统运行

if (isset($cfg_ftp_mkdir) && $cfg_ftp_mkdir == 'Y') {

    $cfg_dir_purview = '0755';

} else {

    $cfg_dir_purview = 0755;

}


//会员是否使用精简模式(已禁用)

$cfg_mb_lit = 'N';


//特殊全局变量

$_sys_globals['curfile'] = '';

$_sys_globals['typeid'] = 0;

$_sys_globals['typename'] = '';

$_sys_globals['aid'] = 0;


if (empty($cfg_addon_savetype)) {

    $cfg_addon_savetype = 'Ymd';

}

if ($cfg_sendmail_bysmtp == 'Y' && !empty($cfg_smtp_usermail)) {

    $cfg_adminemail = $cfg_smtp_usermail;

}

/**

 * intval(a,b);获取变量的整数值。b默认是十进制。返回变量a的十进制整数值。

 */

//对全局分页传递参数进行过滤

if (isset($GLOBALS['PageNo'])) {

    $GLOBALS['PageNo'] = intval($GLOBALS['PageNo']);

}

if (isset($GLOBALS['TotalResult'])) {

    $GLOBALS['TotalResult'] = intval($GLOBALS['TotalResult']);

}

/**

 * 缓存不懂。属于哪一块?

 */

// ------------------------------------------------------------------------

// 设定缓存配置信息

if ($cfg_memcache_enable == 'Y') {

    $cache_helper_config = array();

    $cache_helper_config['memcache']['is_mc_enable'] = $GLOBALS["cfg_memcache_enable"];

    $cache_helper_config['memcache']['mc'] = array(

        'default' => $GLOBALS["cfg_memcache_mc_defa"],

        'other' => $GLOBALS["cfg_memcache_mc_oth"]

    );

    $cache_helper_config['memcache']['mc_cache_time'] = $GLOBALS["cfg_puccache_time"];

}



if (!isset($cfg_NotPrintHead)) {

    header("Content-Type: text/html; charset={$cfg_soft_lang}");

}


//自动加载类库处理

function __autoload($classname) {

    global $cfg_soft_lang;

    $classname = preg_replace("/[^0-9a-z_]/i", '', $classname);

    if (class_exists($classname)) {

        return TRUE;

    }

    $classfile = $classname . '.php';

    $libclassfile = $classname . '.class.php';

    if (is_file(DEDEINC . '/' . $libclassfile)) {

        require DEDEINC . '/' . $libclassfile;

    } else if (is_file(DEDEMODEL . '/' . $classfile)) {

        require DEDEMODEL . '/' . $classfile;

    } else {

        if (DEBUG_LEVEL === TRUE) {

            echo '<pre>';

            echo $classname . '类找不到';

            echo '</pre>';

            exit();

        } else {

            header("location:/404.html");

            die();

        }

    }

}


//引入数据库类

if ($GLOBALS['cfg_mysql_type'] == 'mysqli' && function_exists("mysqli_init")) {

    require_once(DEDEINC . '/dedesqli.class.php');

} else {

    require_once(DEDEINC . '/dedesql.class.php');

}



//全局常用函数

require_once(DEDEINC . '/common.func.php');

/**

 * 思考5:

 * 从这两个类库文件就能了解到MVC到底是怎么工作的。

 */

// 模块MVC框架需要的控制器和模型基类

require_once(DEDEINC . '/control.class.php');

require_once(DEDEINC . '/model.class.php');


//载入小助手配置,并对其进行默认初始化

if (file_exists(DEDEDATA . '/helper.inc.php')) {

    require_once(DEDEDATA . '/helper.inc.php');

    // 若没有载入配置,则初始化一个默认小助手配置

    if (!isset($cfg_helper_autoload)) {

        $cfg_helper_autoload = array('util', 'charset', 'string', 'time', 'cookie');

    }

    // 初始化小助手

    helper($cfg_helper_autoload);

}


转载于:https://my.oschina.net/yuanyichuan/blog/220250

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值