ホームページ >バックエンド開発 >PHPチュートリアル >Discuz7 php ソース コード、その解決方法
Discuz7 php ソース コード
Discuz7 ソース コード (ディレクトリ、ファイル構造、各ファイルの機能、テンプレート構造、より完全なコード コメントなど) をより完全に分析した人は誰ですか。完全であればあるほど良いです。ありがとうございます。
-----解決策---------
<?php /* [ディスカス!] (C)2001-2009 Comsenz Inc. これはフリーウェアではありません。使用にはライセンス条項が適用されます $Id: common.inc.php 17460 2008-12-24 01:46:38Z 猿 $ */ //magic_quotes_gpc リファレンスを閉じ、PHP エラー レポートを閉じるように設定します エラー報告(0); set_magic_quotes_runtime(0); // スクリプトの開始時刻を取得します。最後に、これをスクリプトの終了時刻から減算して、スクリプト全体の実行時間を取得します。 $mtime =explode(' ', microtime()); $discuz_starttime = $mtime[1] + $mtime[0]; //いくつかの定数を設定します //SYSY_DEBUG は現在デバッグ状態かどうかです。 //IN_DISCUZ は直接閲覧を許可しない一部のページで使用されており、これらのページを直接閲覧すると終了し、「アクセスが拒否されました」と表示されます。 //DISCUZ_ROOT は、現在のフォーラムのホーム ディレクトリを取得するための絶対パスです。 //MAGIC_QUOTES_GPC は、magic_quotes_gpc の現在のステータスです //CURSCRIPT は現在実行中のスクリプトの名前です...今は空に設定されています...他のスクリプトには値が存在します... 定義('SYS_DEBUG', FALSE); 定義('IN_DISCUZ', TRUE); 定義('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7)); 定義('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); !define('CURSCRIPT') &&define('CURSCRIPT', ''); //互換性のため 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; } //セキュリティのため...スクリプトがここで実行される前にこれら 2 つのグローバル配列は定義されないため... if (isset($_REQUEST['GLOBALS']) OR isset($_FILES['GLOBALS'])) { exit('リクエストの汚染が試行されました。'); } //フォーラムの関数ライブラリが含まれています...この関数ライブラリには、フォーラム全体のほぼ全体が使用する必要がある関数が含まれています require_once DISCUZ_ROOT.'./include/global.func.php'; // ビューアが何であるかをテストします...ロボットですか? そうであれば、終了して 403 を表示します... getrobot(); if(定義('NOROBOT') && IS_ROBOT) { exit(header("HTTP/1.1 403 禁止")); } // $_COOKIE などの値を取得し、内部のキーを変数に設定し、値を対応する値に設定し、参照を追加します。 //たとえば、$_COOKIE['discuz_auth'] = '123456' の場合、$discuz_auth = '123456' と設定します。 //等々 foreach(array('_COOKIE', '_POST', '_GET') as $_request) { foreach($$_request as $_key => $_value) { $_key{0} != '_' && $$_key = パパスラッシュ($_value); } } // $_FILES をフィルタリングする、つまり参照を追加する if (!MAGIC_QUOTES_GPC && $_FILES) { $_FILES = ダッドスラッシュ($_FILES); } //いくつかの変数を初期化します $charset = $dbs = $dbcharset = $forumfounders = $metakeywords = $extrahead = $seodescription = $mnid = ''; $plugins = $hooks = $admincp = $jsmenu = $forum = $thread = $ language = $actioncode = $modactioncode = $lang = array(); $_DCOOKIE = $_DSESSION = $_DCACHE = $_DPLUGIN = $advlist = array(); //フォーラムの設定ファイルが含まれます require_once DISCUZ_ROOT.'./config.inc.php'; //$urlxssdefend はフォーラム アクセス ページ防御スイッチで、ユーザーが違法な URL アドレスを通じてこのサイトのユーザーに損害を与えることを防ぎます。 if($urlxssdefend && !empty($_SERVER['REQUEST_URI'])) { $temp = urldecode($_SERVER['REQUEST_URI']); if(strpos($temp, '<') !== false || strpos($temp, '"') !== false) exit('不正な URL をリクエスト'); } //$prelength は Cookie セットのプレフィックスの長さです // $_COOKIE に設定された接頭辞を持つ変数をループチェックします。接頭辞がある場合は、接頭辞なしで $_DCOOKIE に入力します。 //最終的なフィルター値 $prelength = strlen($cookiepre); foreach($_COOKIE as $key => $val) { if(substr($key, 0, $prelength) == $cookiepre) { $_DCOOKIE[(substr($key, $prelength))] = MAGIC_QUOTES_GPC ? $val :dddslashes($val); } } //これらの変数は、$_ クラスの配列操作で使用されるすべての変数を破棄します。 unset($prelength, $_request, $_key, $_value); // $inajax = !empty($inajax); $handlekey = !empty($handlekey) htmlspecialchars($handlekey) : ''; $タイムスタンプ = 時間(); //$ Attackevasive フォーラムの防御レベル。多数の異常なリクエストによって引き起こされるサービス拒否攻撃を防ぐことができます。 if($攻撃回避 && CURSCRIPT != '秒コード') { require_once DISCUZ_ROOT.'./include/security.inc.php'; } //データベースクラスを含むファイル require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php'; //$PHP_SELF は、Web サイトのホーム ディレクトリを基準とした現在アクティブなスクリプトのパスです //$BASESCRIPT は、現在アクティブなスクリプト ファイル名に拡張子を追加します //$BASEFILENAME は拡張子を除いた現在アクティブなスクリプト ファイルの名前です //$boardurl は、現在アクティブなスクリプトの完全な Web サイト パスであり、次のファイル名を削除します。 api|archiver|wap フォルダーがある場合は、それを削除します。 $PHP_SELF = dhtmlspecialchars($_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']); $BASESCRIPT = ベース名($PHP_SELF); list($BASEFILENAME) =explode('.', $BASESCRIPT); $boardurl = htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].preg_replace("//+(api|archiver|wap)?/*$/i", '', substr($PHP_SELF, 0 , strrpos($PHP_SELF, '/'))).'/'); // 現在のブラウザ IP を取得する 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']; } preg_match("/[d.]{7,15}/", $onlineip, $onlineipmatches); $onlineip = $onlineipmatches[0] $onlineipmatches[0] : '不明'; unset($onlineipmatches); //設定のキャッシュをインクルードし、内部の配列を抽出します。理解できない場合は、この関数の説明を読んでください...くどくどではありません... $cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') '' : '設定'; @extract($_DCACHE['設定']); //GZIP 圧縮がオンで、サーバーにこの機能がある場合 //そして現在のスクリプトはwapとattachmentではありません //そして inajax は FLASE です //単に ob_start('ob_gzhandler') それ以外の場合は単に ob_start(); if($gzipcompress && function_exists('ob_gzhandler') && !in_array(CURSCRIPT, array('attachment', 'wap')) && !$inajax) { ob_start('ob_gzhandler'); } それ以外 { $gzipcompress = 0; ob_start(); } //ロードバランシングの為、$loadctrlがどこにあるのか分かりません…すいません 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 サービスが利用できません"); include DISCUZ_ROOT.'./include/serverbusy.htm'; 出口(); } } } //他のキャッシュファイルを含める if(in_array(CURSCRIPT, array('index', 'forumdisplay', 'viewthread', 'post', 'topicadmin', 'register', 'archiver'))) { $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/cache_'.CURSCRIPT.'.php') '' : ' '.CURSCRIPT; } //データベースに接続し、完了後にこれらの値を NULL に設定します $db = 新しい DB スタッフ; $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, true, $dbcharset); $dbuser = $dbpw = $pconnect = $sdb = NULL; // とにかく、必要な sid を見つけてフィルタリングしたところ、$transsidstatus がどこにあるかわかりませんでした。 // sid を介して送信されたものがバックグラウンドで設定されているかどうか、および wap を介してアクセスされているかどうかを確認します。 //また、$_GET または $_POST に sid はありますか? //上記の結論が正しい場合は GET から SID を取得し、そうでない場合は $_DCOOKIE から取得します。 $sid = godslashes(($transsidstatus || CURSCRIPT == 'wap') && (isset($_GET['sid']) || isset($_POST['sid'])) ? (isset($_GET['sid']) ? $_GET['sid'] : $_POST['sid']) : (isset($_DCOOKIE['sid']) ? $_DCOOKIE['sid'] : '')); //現在のスクリプトが添付ファイル sid であり、GET を通じて取得された場合は、暗号化してからフィルターします。 CURSCRIPT == 'attachment' && isset($_GET['sid']) && $sid =addslashes(authcode($_GET['sid'], 'DECODE', $_DCACHE['settings']['authkey']) ); // $discuz_auth_key、MD5 暗号化を設定します。 。 $discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']); //それぞれパスワード、プロンプトの質問、uid に対応する 3 つの変数 $discuz_pw、$discuz_secques、$discuz_uid を取得します。 //これら 3 つの値を強制的にフィルタリングします list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array('', '', 0) :dddslashes(explode("t", authcode($_DCOOKIE['auth' ]、'デコード'))、1); // 最初の行は変数の初期化に使用されます (変数を使用するときは常に初期化を考慮する必要があります。そうでない場合、セキュリティについては言及する価値がありません) //次のステップは、sid があるかどうかを判断することです。ある場合は、cdb_session テーブルから取得し、cdb_members テーブルに接続して取得します。 //変数 $membertablefields に完全に書き込まれています //sessionexist 変数にマークを付けて、このメンバーがオンラインであることを示します。$prompt = $sessionexists = $seccode = 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.prompt、m.accessmasks、m.editormode、m.customshow、m.customaddfeed'; 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、{$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'"); } それ以外 { $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)) { $セッション存在 = 1; if(!empty($_DSESSION['sessionuid'])) { $_DSESSION = array_merge($_DSESSION, $db->fetch_first("SELECT $membertablefields FROM {$tablepre}メンバー m WHERE uid='$_DSESSION[sessionuid]'")); } } それ以外 { if($_DSESSION = $db->fetch_first("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'")) { クリアクッキー(); $セッション存在 = 1; } } } //回線がない場合は実行 //如果COOKIE不正确就清除 //IP が被監視対象である場合、被監視対象 (標識済み一下) //SID SECCODE に機械変数を 1 つ書き込みます if(!$sessionexists) { if($discuz_uid) { if(!($_DSESSION = $db->fetch_first("SELECT $membertablefields, m.styleid FROM {$tablepre}members m WHERE m.uid='$discuz_uid' AND m.password='$discuz_pw' AND m.secques='$discuz_secques'"))) { クリアクッキー(); } } <div class="clear"></div>