자동으로 코드를 체크하는 기능
<?php
ob_start();
@ini_set('pcre.backtrack_limit', '10000000');
@ini_set('pcre.recursion_limit', '10000000');
@ini_set('memory_limit', '256M');
if (!empty($_SERVER['REQUEST_URI'])) {
$_dxRawPath = strtok($_SERVER['REQUEST_URI'], '?');
$_dxRawQuery = strpos($_SERVER['REQUEST_URI'], '?') !== false
? substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?')) : '';
if (strpos($_dxRawPath, '//') !== false) {
if (!headers_sent()) {
header('Location: ' . preg_replace('#/+#', '/', $_dxRawPath) . $_dxRawQuery, true, 301);
}
exit;
}
}
if (version_compare(PHP_VERSION, '5.6.0', '<')) {
header('Content-Type: text/html; charset=UTF-8');
die('<h2 style="font-family:sans-serif;color:#dc2626">PHP 5.6 이상이 필요합니다. 현재: ' . PHP_VERSION . '</h2>');
}
define('DX_CMS', true);
define('DX_VERSION', '8.8.0');
define('DX_ROOT', str_replace('\\', '/', dirname(__FILE__)));
define('DX_CORE', DX_ROOT . '/core');
define('DX_DATA', DX_ROOT . '/data');
define('DX_THEMES', DX_ROOT . '/themes');
define('DX_PLUGINS', DX_ROOT . '/plugins');
define('DX_PAGES', DX_ROOT . '/pages');
define('DX_BOARDS', DX_ROOT . '/boards');
define('DX_EXTEND', DX_ROOT . '/extend');
define('DX_START', microtime(true));
define('DX_START_TIME', DX_START);
$_dxConfigFile = DX_ROOT . '/data/config.php';
$_dxInstalled = file_exists($_dxConfigFile);
if ($_dxInstalled) {
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
@ini_set('display_errors', 0);
@ini_set('log_errors', 1);
@ini_set('error_log', DX_ROOT . '/data/error.log');
} else {
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
@ini_set('display_errors', 1);
}
if (!$_dxInstalled) {
$_dxScheme = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
|| (!empty($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443)
? 'https' : 'http';
$_dxHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
$_dxDir = '';
if (isset($_SERVER['SCRIPT_NAME'])) {
$_d = dirname(str_replace('\\', '/', $_SERVER['SCRIPT_NAME']));
if ($_d !== '.' && $_d !== '/') $_dxDir = rtrim($_d, '/');
}
if (!headers_sent()) {
header('Location: ' . $_dxScheme . '://' . $_dxHost . $_dxDir . '/install/');
}
exit;
}
$_dxIsHttps = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
|| (!empty($_SERVER['SERVER_PORT']) && (int)$_SERVER['SERVER_PORT'] === 443)
|| (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
|| (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && strtolower($_SERVER['HTTP_X_FORWARDED_SSL']) === 'on')
|| (!empty($_SERVER['HTTP_CF_VISITOR']) && strpos($_SERVER['HTTP_CF_VISITOR'], 'https') !== false);
$_dxSecurityPathValue = '';
if ($_dxInstalled) {
$_dxCfgRaw = @file_get_contents($_dxConfigFile);
if ($_dxCfgRaw !== false) {
$_dxSpPat = "/define\\s*\\(\\s*[\\x22\\x27]DX_SECURITY_PATH[\\x22\\x27]\\s*,\\s*[\\x22\\x27]([a-f0-9]{16})[\\x22\\x27]\\s*\\)/";
if (preg_match($_dxSpPat, $_dxCfgRaw, $_dxSpM)) {
$_dxSecurityPathValue = $_dxSpM[1];
}
}
unset($_dxCfgRaw, $_dxSpM);
}
require_once DX_CORE . '/functions.php';
require_once DX_CORE . '/DxCache.php';
if ($_dxSecurityPathValue) {
$_dxSecurePath = DX_CORE . '/security/' . $_dxSecurityPathValue . '/Secure.php';
if (!file_exists($_dxSecurePath)) {
$_dxSecurePath = DX_CORE . '/Secure.php';
}
} else {
$_dxSecurePath = DX_CORE . '/Secure.php';
}
require_once $_dxSecurePath;
require_once DX_CORE . '/DxSanitizer.php';
require_once DX_CORE . '/db/Database.php';
require_once DX_CORE . '/hook/HookManager.php';
require_once DX_CORE . '/PluginRegistry.php';
require_once DX_CORE . '/auth/Auth.php';
require_once DX_CORE . '/DxPoint.php';
require_once DX_CORE . '/DxFriend.php';
require_once DX_CORE . '/DxShop.php';
require_once DX_CORE . '/DxSite.php';
require_once DX_CORE . '/DxTheme.php';
require_once DX_CORE . '/DxSeo.php';
require_once DX_CORE . '/DxCategory.php';
require_once DX_CORE . '/DxThumb.php';
require_once DX_CORE . '/DxNotification.php';
require_once DX_CORE . '/DxMemberMonitor.php';
require_once DX_CORE . '/DxPopup.php';
require_once DX_CORE . '/DxBoardSkin.php';
require_once DX_CORE . '/DxMarket.php';
if (file_exists(DX_CORE . '/DxSocialAuth.php')) require_once DX_CORE . '/DxSocialAuth.php';
require_once DX_CORE . '/DxExtend.php';
require_once DX_CORE . '/router/Router.php';
require_once DX_CORE . '/router/Dispatcher.php';
require_once DX_CORE . '/db/QueryBuilder.php';
require_once DX_CORE . '/DxContainer.php';
require_once DX_CORE . '/DxRouter.php';
$_dxSecure = Secure::getInstance();
$_dxSecure->initSession($_dxIsHttps);
$_dxNeedSession = true;
if (
isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'GET' &&
empty($_COOKIE[session_name()]) &&
!isset($_SERVER['HTTP_X_REQUESTED_WITH'])
) {
$_dxUri = dx_request_uri();
if (strpos($_dxUri, '/admin') !== false
|| strpos($_dxUri, '/auth') !== false
|| strpos($_dxUri, '/view/') !== false
|| strpos($_dxUri, '/api/') !== false
|| strpos($_dxUri, '/write') !== false
|| strpos($_dxUri, '/edit') !== false
|| strpos($_dxUri, '/reply') !== false
) {
} else {
$_dxNeedSession = false;
}
}
if ($_dxNeedSession) {
$_dxSecure->startSession();
}
$_dxSecure->sendSecurityHeaders();
if ($_dxNeedSession) {
$_dxSecure->csrfToken();
}
require_once $_dxConfigFile;
if (!defined('DX_DEBUG')) define('DX_DEBUG', false);
if (!defined('DX_SECURITY_PATH')) define('DX_SECURITY_PATH', '');
require_once DX_CORE . '/DxDebugBar.php';
$_dxSecretVal = dx_config('secret_key', '');
if (!defined('DX_SECRET_KEY')) {
if ($_dxSecretVal) {
define('DX_SECRET_KEY', $_dxSecretVal);
$_dxCfgPath = DX_ROOT . '/data/config.php';
if (is_writable($_dxCfgPath)) {
$_dxCfgContent = file_get_contents($_dxCfgPath);
if ($_dxCfgContent !== false && strpos($_dxCfgContent, 'DX_SECRET_KEY') === false) {
$appendLine = PHP_EOL . "define('DX_SECRET_KEY', '" . addslashes($_dxSecretVal) . "');" . PHP_EOL;
file_put_contents($_dxCfgPath, $_dxCfgContent . $appendLine);
}
unset($_dxCfgContent);
}
}
}
$_dxSecure->initSecretKeys($_dxSecretVal);
HookManager::getInstance();
PluginRegistry::getInstance();
load_plugins();
_dx_register_point_hooks();
Secure::getInstance()->initSecurity();
DxSite::getInstance();
DxTheme::getInstance();
Auth::getInstance();
DxContainer::getInstance()->registerCoreServices();
DxExtend::getInstance()->ensureDirs();
dx_add_hook('dx_body_bottom', function() {
DxPopup::render();
}, 50);
dx_add_hook('dx_after_login', function($args) {
$user = isset($args['user']) ? $args['user'] : null;
if ($user && isset($user['id'])) {
DxMemberMonitor::onLogin((int)$user['id']);
}
}, 20);
dx_add_hook('dx_after_logout', function($args) {
$user = isset($args['user']) ? $args['user'] : null;
if ($user && isset($user['id'])) {
DxMemberMonitor::onLogout((int)$user['id']);
}
}, 20);
if (Auth::getInstance()->isLoggedIn()) {
DxMemberMonitor::onRequest((int)Auth::getInstance()->get('id', 0));
}
DxExtend::getInstance()->runTop(array(
'version' => DX_VERSION,
'path' => dx_request_uri(),
));
$_dxRouteDir = DX_ROOT . '/routes';
if (is_dir($_dxRouteDir)) {
$_dxRouteFiles = glob($_dxRouteDir . '/*.php');
if ($_dxRouteFiles) {
sort($_dxRouteFiles);
foreach ($_dxRouteFiles as $_dxRouteFile) {
require_once $_dxRouteFile;
}
}
}
unset($_dxRouteDir, $_dxRouteFiles, $_dxRouteFile);
if (!DxRouter::dispatch()) {
$_dxDispatcher = new Dispatcher(new Router());
$_dxDispatcher->dispatch();
}
DxExtend::getInstance()->runBottom(array(
'elapsed' => round((microtime(true) - DX_START) * 1000, 2),
));
if (ob_get_level() > 0) {
ob_end_flush();
}