第一个文件当然是分析./include/common.inc.php这个文件,这个是Discuz的核心中的核心,基本上每次操作都include到了这个文件,下面就分七段来分析这个文件:
Section One:
代码:
//定义PHP一些环境
error_reporting(0);
set_magic_quotes_runtime(0);
//设置Discuz开始的时间
$mtime = explode(' ', microtime());
$discuz_starttime = $mtime[1] + $mtime[0];
//定义一些常量
define('SYS_DEBUG', FALSE);
define('IN_DISCUZ', TRUE);
define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7)); //获得绝对目录
//通用性
if(PHP_VERSION < '4.1.0') {
$_GET = &$HTTP_GET_VARS;
$_POST = &$HTTP_POST_VARS;
$_COOKIE = &$HTTP_COOKIE_VARS;
$_SERVER = &$HTTP_SERVER_VARS;
$_ENV = &$HTTP_ENV_VARS;
$_FILES = &$HTTP_POST_FILES;
}
Section Two:
代码:
require_once DISCUZ_ROOT.'./include/global.func.php';
代码:
define('ISROBOT', getrobot());
if(defined('NOROBOT') && ISROBOT) {
exit(header("HTTP/1.1 403 Forbidden"));
}
代码:
define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
isset($_REQUEST['GLOBALS']) && exit('Access Error');
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($_request as $_key => $_value) {
$_key{0} != '_' && $_key = daddslashes($_value);
}
}
(!MAGIC_QUOTES_GPC) && $_FILES = daddslashes($_FILES);
代码:
$charset = $dbcharset = $forumfounders = $metakeywords = $extrahead = '';
$plugins = $hooks = $admincp = array();
require_once DISCUZ_ROOT.'./config.inc.php';
$_DCOOKIE = $_DSESSION = $_DCACHE = $_DPLUGIN = $advlist = array();
$prelength = strlen($cookiepre);
foreach($_COOKIE as $key => $val) {
if(substr($key, 0, $prelength) == $cookiepre) {
$_DCOOKIE[(substr($key, $prelength))] = MAGIC_QUOTES_GPC ? $val : daddslashes($val);
}
}
代码:
unset($prelength, $_request, $_key, $_value);
$timestamp = time();
if($attackevasive) {
require_once DISCUZ_ROOT.'./include/security.inc.php';
}
代码:
require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';
$PHP_SELF = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$SCRIPT_FILENAME = str_replace('\\\\', '/',
(isset($_SERVER['PATH_TRANSLATED']) ? $_SERVER['PATH_TRANSLATED'] :
$_SERVER['SCRIPT_FILENAME']));
$boardurl =
'http://'.$_SERVER['HTTP_HOST'].preg_replace("/\/+(api|archiver|wap)?\/*$/i",
'', substr($PHP_SELF, 0, strrpos($PHP_SELF, '/'))).'/';
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) &&
$_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'],
'unknown')) {
$onlineip = $_SERVER['REMOTE_ADDR'];
}
然后接下的作用就是得到自身的名称$PHP_SELF,自身的文件名字$SCRIPT_FILENAME,论坛的地址$boardurl,得到浏览者的一些信息,比方说ip地址,浏览器类型等等。
Section Three:
代码:
preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
$onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
unset($onlineipmatches);
代码:
$cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
@extract($_DCACHE['settings']);
代码:
if($gzipcompress && function_exists('ob_gzhandler') && CURSCRIPT != 'wap') {
ob_start('ob_gzhandler');
} else {
$gzipcompress = 0;
ob_start();
}
代码:
if(!empty($loadctrl) && substr(PHP_OS, 0, 3) != 'WIN') {
if($fp = @fopen('/proc/loadavg', 'r')) {
list($loadaverage) = explode(' ', fread($fp, 6));
fclose($fp);
if($loadaverage > $loadctrl) {
header("HTTP/1.0 503 Service Unavailable");
include DISCUZ_ROOT.'./include/serverbusy.htm';
exit();
}
}
}
代码:
if(defined('CURSCRIPT') && in_array(CURSCRIPT,
array('index', 'forumdisplay', 'viewthread', 'post', 'blog', 'pm',
'topicadmin', 'register', 'archiver'))) {
$cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/cache_'.CURSCRIPT.'.php') ? '' : ' '.CURSCRIPT;
}
Section Four:
代码:
$db = new dbstuff;
$db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
$dbhost = $dbuser = $dbpw = $dbname = $pconnect = NULL;
代码:
$sid = daddslashes(($transsidstatus ||
(defined('CURSCRIPT') && CURSCRIPT == 'wap'))&&
(isset($_GET['sid']) || isset($_POST['sid'])) ?
(isset($_GET['sid']) ? $_GET['sid'] : $_POST['sid']) :
(isset($_DCOOKIE['sid']) ? $_DCOOKIE['sid'] : ''));
代码:
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
代码:
if(isset($_DCOOKIE['auth']) && $_DCOOKIE['auth']) {
list($discuz_pw, $discuz_secques, $discuz_uid) =
daddslashes(explode("\t", authcode($_DCOOKIE['auth'], 'DECODE')), 1);
if(!is_numeric($discuz_uid) || !$discuz_uid) {
clearcookies();
}
} else {
list($discuz_pw, $discuz_secques, $discuz_uid) = array('', '', 0);
}
Section Five:
代码:
$newpm = $newpmexists = $sessionexists = $seccode = $bloguid = 0;//初始化变量
$membertablefields = 'm.uid AS discuz_uid, m.username AS discuz_user, m.password AS discuz_pw, m.secques AS discuz_secques,
m.adminid, m.groupid, m.groupexpiry, m.extgroupids, m.email, m.timeoffset, m.tpp, m.ppp, m.posts, m.digestposts,
m.oltime, m.pageviews, m.credits, m.extcredits1, m.extcredits2, m.extcredits3, m.extcredits4, m.extcredits5,
m.extcredits6, m.extcredits7, m.extcredits8, m.timeformat, m.dateformat, m.pmsound, m.sigstatus, m.invisible,
m.lastvisit, m.lastactivity, m.lastpost, m.newpm, m.accessmasks, m.xspacestatus, m.editormode, m.customshow';
if($sid) {
if($discuz_uid) {
$query = $db->query("SELECT s.sid, s.styleid,
s.groupid='6' AS ipbanned, s.pageviews AS spageviews, s.lastolupdate,
s.seccode, $membertablefields
FROM {$tablepre}sessions s, {$tablepre}members m
WHERE m.uid=s.uid AND s.sid='$sid' AND
CONCAT_WS('.',s.ip1,s.ip2,s.ip3,s.ip4)='$onlineip' AND
m.uid='$discuz_uid'
AND m.password='$discuz_pw' AND m.secques='$discuz_secques'");
} else {
$query = $db->query("SELECT sid, uid AS
sessionuid, groupid, groupid='6' AS ipbanned, pageviews AS spageviews,
styleid, lastolupdate, seccode
FROM {$tablepre}sessions WHERE sid='$sid' AND CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'");
}
if($_DSESSION = $db->fetch_array($query)) {
$sessionexists = 1;
if(!empty($_DSESSION['sessionuid'])) {
$query = $db->query("SELECT $membertablefields
FROM {$tablepre}members m WHERE uid='$_DSESSION[sessionuid]'");
$_DSESSION = array_merge($_DSESSION, $db->fetch_array($query));
}
} else {
$query = $db->query("SELECT sid, groupid,
groupid='6' AS ipbanned, pageviews AS spageviews, styleid, lastolupdate,
seccode
FROM {$tablepre}sessions WHERE sid='$sid' AND CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'");
if($_DSESSION = $db->fetch_array($query)) {
clearcookies();
$sessionexists = 1;
}
}
}
接下来是判断是不是有sid,有的话就从cdb_session表中取来,然后连接一下cdb_members表取出一些更具体的东西,具体是哪些东西? 在$membertablefields这个变量里面已经全面写出来了,对应数据库看吧,不看的话用英语猜猜得出的。。。在这里Discuz标记了一个 sessionexist变量,表示这个会员是在线的。
代码:
if(!$sessionexists) {
if($discuz_uid) {
$query = $db->query("SELECT $membertablefields
FROM {$tablepre}members m WHERE
m.uid='$discuz_uid' AND m.password='$discuz_pw' AND
m.secques='$discuz_secques'");
if(!($_DSESSION = $db->fetch_array($query))) {
clearcookies();
}
}
代码:
if(ipbanned($onlineip)) $_DSESSION['ipbanned'] = 1;
$_DSESSION['sid'] = random(6);
$_DSESSION['seccode'] = random(6, 1);
}
$_DSESSION['dateformat'] = empty($_DSESSION['dateformat']) ? $_DCACHE['settings']['dateformat'] : $_DSESSION['dateformat'];
$_DSESSION['timeformat'] = empty($_DSESSION['timeformat']) ?
$_DCACHE['settings']['timeformat'] : ($_DSESSION['timeformat'] == 1 ?
'h:i A' : 'H:i');
$_DSESSION['timeoffset'] = isset($_DSESSION['timeoffset'])
&& $_DSESSION['timeoffset'] != 9999 ? $_DSESSION['timeoffset'] :
$_DCACHE['settings']['timeoffset'];
代码:
$membertablefields = '';
@extract($_DSESSION);
$lastvisit = empty($lastvisit) ? $timestamp - 86400 : $lastvisit;
$timenow = array('time' => gmdate("$dateformat $timeformat", $timestamp + 3600 * $timeoffset),
'offset' => ($timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset));
if(PHP_VERSION > '5.1') {
@date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset)));
}
接下来给一个现在的时间,这里有一个时间的问题,所以把时间加上时差乘上3600秒就得到当前时间了。
PHP 5 能处理时差了,所以Discuz在这里也设置了一下,想得真全面!!
Section Six:
代码:
$accessadd1 = $accessadd2 = $modadd1 = $modadd2 = '';
if(empty($discuz_uid) || empty($discuz_user)) {
$discuz_user = $extgroupids = '';
$discuz_uid = $adminid = $posts = $digestposts = $pageviews = $oltime = $invisible
= $credits = $extcredits1 = $extcredits2 = $extcredits3 = $extcredits4
= $extcredits5 = $extcredits6 = $extcredits7 = $extcredits8 = 0;
$groupid = empty($groupid) || $groupid != 6 ? 7 : 6;
} else {
$discuz_userss = $discuz_user;
$discuz_user = addslashes($discuz_user);
if($accessmasks) {
$accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowpostattach';
$accessadd2 = "LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid";
}
if($adminid == 3) {
$modadd1 = ', m.uid AS ismoderator';
$modadd2 = "LEFT JOIN {$tablepre}moderators m ON m.uid='$discuz_uid' AND m.fid=f.fid";
}
}
if($errorreport == 2 || ($errorreport == 1 && $adminid > 0)) {
error_reporting(E_ERROR | E_WARNING | E_PARSE);
}
然后看看怎么样设置PHP 的出错级别,注意如果你的管理员的话,Discuz给的是一个更高的错误显示级别!
代码:
define('FORMHASH', formhash());
$statstatus && require_once DISCUZ_ROOT.'./include/counter.inc.php';
$extra = isset($extra) && @preg_match("/^[&=;a-z0-9]+$/i", $extra) ? $extra : '';
$tpp = intval(empty($_DSESSION['tpp']) ? $topicperpage : $_DSESSION['tpp']);
$ppp = intval(empty($_DSESSION['ppp']) ? $postperpage : $_DSESSION['ppp']);
引用:
$extra这个东东不知道做嘛用的。。。。
$tpp-threads per page每页的帖子数
$ppp-posts per page每页的回复数
代码:
$rsshead = $navtitle = $navigation = '';
$_DSESSION['groupid'] = $groupid = empty($ipbanned) ? (empty($groupid) ? 7 : intval($groupid)) : 6;
if(!@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.$groupid.'.php') {
$query = $db->query("SELECT type FROM {$tablepre}usergroups WHERE groupid='$groupid'");
$grouptype = $db->result($query, 0);
if(!empty($grouptype)) {
$cachelost .= ' usergroup_'.$groupid;
} else {
$grouptype = 'member';
}
}
代码:
if($passport_status && ($passport_status != 'shopex' || !$passport_shopex)) {
$passport_forward = rawurlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$link_login =
$passport_url.$passport_login_url.(strpos($passport_login_url, '?') ===
FALSE ? '?' : '&').'forward='.$passport_forward;
$link_logout =
$passport_url.$passport_logout_url.(strpos($passport_logout_url, '?')
=== FALSE ? '?' : '&').'forward='.$passport_forward;
$link_register =
$passport_url.$passport_register_url.(strpos($passport_register_url,
'?') === FALSE ? '?' : '&').'forward='.$passport_forward;
} else {
$link_login = 'logging.php?action=login';
$link_logout = 'logging.php?action=logout&formhash='.FORMHASH;
$link_register = 'register.php';
}
代码:
if($discuz_uid && $_DSESSION) {
if(!empty($groupexpiry) && $groupexpiry <
$timestamp && (!defined('CURSCRIPT') || (CURSCRIPT != 'wap'
&& CURSCRIPT != 'member'))) {
dheader("Location: {$boardurl}member.php?action=groupexpiry");
} elseif($grouptype && $groupid != getgroupid($discuz_uid, array
(
'type' => $grouptype,
'creditshigher' => $groupcreditshigher,
'creditslower' => $groupcreditslower
), $_DSESSION)) {
@extract($_DSESSION);
$cachelost .= (@include
DISCUZ_ROOT.'./forumdata/cache/usergroup_'.intval($groupid).'.php') ? ''
: ' usergroup_'.$groupid;
}
}
Section Seven:
代码:
if(!in_array($adminid, array(1, 2, 3))) {
$alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune
= $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser
= $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = $supe_allowpushthread = 0;
} elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) {
$cachelost .= (@include
DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ?
'' : ' admingroup_'.$groupid;
}
代码:
$forum = array();
$auditstatuson = !empty($mod) && $mod == 'edit' &&
in_array($adminid, array(1, 2, 3)) && $allowmodpost ? true :
false;
$tid = isset($tid) && is_numeric($tid) ? $tid : 0;
$fid = isset($fid) && is_numeric($fid) ? $fid : 0;
$typeid = isset($typeid) ? intval($typeid) : 0;
if(!empty($tid) || !empty($fid)) {
if(empty($tid)) {
$query = $db->query("SELECT f.fid, f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
FROM {$tablepre}forums f
LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid $accessadd2 $modadd2
WHERE f.fid='$fid'");
$forum = $db->fetch_array($query);
} else {
$query = $db->query("SELECT t.tid,
t.closed,".(defined('SQL_ADD_THREAD') ? SQL_ADD_THREAD : '')." f.*, ff.*
$accessadd1 $modadd1, f.fid AS fid
FROM {$tablepre}threads t
INNER JOIN {$tablepre}forums f ON f.fid=t.fid
LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid $accessadd2 $modadd2
WHERE t.tid='$tid'".($auditstatuson ? '' : " AND t.displayorder>='0'")." LIMIT 1");
$forum = $db->fetch_array($query);
$tid = $forum['tid'];
}
if($forum) {
$fid = $forum['fid'];
$forum['ismoderator'] = !empty($forum['ismoderator']) || $adminid == 1 || $adminid == 2 ? 1 : 0;
foreach(array('postcredits', 'replycredits',
'threadtypes', 'digestcredits', 'postattachcredits', 'getattachcredits',
'supe_pushsetting') as $key) {
$forum[$key] = !empty($forum[$key]) ? unserialize($forum[$key]) : array();
}
} else {
$fid = 0;
}
}
代码:
$styleid = intval(!empty($_GET['styleid']) ? $_GET['styleid'] :
(!empty($_POST['styleid']) ? $_POST['styleid'] :
(!empty($_DSESSION['styleid']) ? $_DSESSION['styleid'] :
$_DCACHE['settings']['styleid'])));
$styleid = intval(isset($stylejump[$styleid]) ? $styleid : $_DCACHE['settings']['styleid']);
if(@!include
DISCUZ_ROOT.'./forumdata/cache/style_'.intval(!empty($forum['styleid']) ?
$forum['styleid'] : $styleid).'.php') {
$cachelost .= (@include
DISCUZ_ROOT.'./forumdata/cache/style_'.($styleid =
$_DCACHE['settings']['styleid']).'.php') ? '' : ' style_'.$styleid;
}
如果没有缓存的话,再往cachelost这个里面写点东西。
代码:
if($cachelost) {
require_once DISCUZ_ROOT.'./include/cache.func.php';
updatecache();
dexit('Cache List: '.$cachelost.'<br>Caches successfully created, please refresh.');
}
代码:
if(!defined('CURSCRIPT') || CURSCRIPT != 'wap') {
if($nocacheheaders) {
@dheader("Expires: 0");
@dheader("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
@dheader("Pragma: no-cache");
}
if($headercharset) {
@dheader('Content-Type: text/html; charset='.$charset);
}
if(empty($_DCOOKIE['sid']) || $sid != $_DCOOKIE['sid']) {
dsetcookie('sid', $sid, 604800);
}
}
代码:
if($cronnextrun && $cronnextrun <= $timestamp) {
require_once DISCUZ_ROOT.'./include/cron.func.php';
runcron();
}
代码:
if(isset($plugins['include']) && is_array($plugins['include'])) {
foreach($plugins['include'] as $include) {
if(!$include['adminid'] || ($include['adminid'] && $include['adminid'] >= $adminid)) {
@include_once DISCUZ_ROOT.'./plugins/'.$include['script'].'.inc.php';
}
}
}
代码:
if((!empty($_DCACHE['advs']) || $globaladvs || $redirectadvs) && !defined('IN_ADMINCP')) {
require_once DISCUZ_ROOT.'./include/advertisements.inc.php';
}
代码:
if(isset($allowvisit) && $allowvisit == 0
&& !(defined('CURSCRIPT') && CURSCRIPT == 'member'
&& $action == 'groupexpiry')) {
showmessage('user_banned', NULL, 'HALTED');
} elseif(!((defined('CURSCRIPT') && in_array(CURSCRIPT, array('logging', 'wap', 'seccode'))) || $adminid == 1)) {
if($bbclosed) {
clearcookies();
$closedreason = $db->result($db->query("SELECT
value FROM {$tablepre}settings WHERE variable='closedreason'"), 0);
showmessage($closedreason ? $closedreason : 'board_closed', NULL, 'NOPERM');
}
periodscheck('visitbanperiods');
}
代码:
if((!empty($fromuid) || !empty($fromuser)) &&
($creditspolicy['promotion_visit'] ||
$creditspolicy['promotion_register'])) {
require_once DISCUZ_ROOT.'/include/promotion.inc.php';
}
代码:
$rssauth = $rssstatus && $discuz_uid ?
rawurlencode(authcode("$discuz_uid\t".($fid ? $fid :
'')."\t".substr(md5($discuz_pw.$discuz_secques), 0, 8), 'ENCODE',
md5($_DCACHE['settings']['authkey']))) : '0';