Files
BESCMS/dayrui/System/Extend/Run.php
T

164 lines
4.3 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace Frame;
require CMSPATH.'Core/Phpcmf.php';
class Run
{
/**
* App startup time.
*
* @var float|null
*/
protected $startTime;
/**
* Total app execution time
*
* @var float
*/
protected $totalTime;
/**
* Main application configuration
*
* @var App
*/
protected $config;
/**
* Timer instance.
*
* @var Timer
*/
protected $benchmark;
/**
* Constructor.
*/
public function __construct()
{
$this->startTime = microtime(true);
}
/**
* Start the Benchmark
*
* The timer is used to display total script execution both in the
* debug toolbar, and potentially on the displayed page.
*
* @return void
*/
protected function startBenchmark()
{
if ($this->startTime === null) {
$this->startTime = microtime(true);
}
$this->benchmark = new \CodeIgniter\Debug\Timer();
$this->benchmark->start('total_execution', $this->startTime);
$this->benchmark->start('bootstrap');
}
/**
* Returns an array with our basic performance stats collected.
*/
public function getPerformanceStats(): array
{
// After filter debug toolbar requires 'total_execution'.
$this->totalTime = $this->benchmark->getElapsedTime('total_execution');
return [
'startTime' => $this->startTime,
'totalTime' => $this->totalTime,
];
}
public function bootWeb()
{
if (CI_DEBUG) {
$this->startBenchmark();
\CodeIgniter\Events\Events::trigger('pre_system');
}
$controller = 'Home';
$method = 'index';
if (IS_ADMIN) {
$namespace = '\\Phpcmf\\'.(APP_DIR ? 'Controllers' : 'Control').'\\Admin';
} elseif (IS_MEMBER) {
$namespace = '\\Phpcmf\\'.(APP_DIR == 'member' ? 'Controllers' : 'Controllers\\Member');
} elseif (IS_API) {
$namespace = '\\Phpcmf\\'.(APP_DIR ? 'Controllers' : 'Control').'\\Api';
} else {
$namespace = '\\Phpcmf\\'.(APP_DIR ? 'Controllers' : 'Control');
}
isset($_GET['c']) && $_GET['c'] && is_string($_GET['c']) && $controller = (ucfirst(dr_safe_filename($_GET['c'])));
isset($_GET['m']) && $_GET['m'] && is_string($_GET['m']) && $method = (dr_safe_filename($_GET['m']));
$class = $namespace.'\\'.$controller;
if (! class_exists($class)) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forControllerNotFound($class);
exit('<font color=red>控制器不存在</font>');
}
$app = new $class;
if (! method_exists($app, $method)) {
throw \CodeIgniter\Exceptions\PageNotFoundException::forMethodNotFound($class, $method);
exit('<font color=red>方法不存在</font>');
}
if (IS_POST && SYS_CSRF) {
// SYS_CSRF
if (in_array(\Phpcmf\Service::L('router')->uri(), \Phpcmf\Service::Filters())) {
// 过滤白名单内的控制器
} elseif ((defined('IS_API_HTTP') && IS_API_HTTP) || (defined('IS_API') && IS_API)) {
// api 请求下不做验证
} elseif (SYS_CSRF == 1 && IS_ADMIN) {
// 宽松模式,后台不验证
} else {
$token = \Phpcmf\Service::L('Security')->csrf_token();
$value = \Phpcmf\Service::L('Security')->csrf_hash();
$post = isset($_POST[$token]) && $_POST[$token] ? dr_safe_replace($_POST[$token]) : 'null';
if ($post == $value) {
// 验证通过
} else {
// 验证失败
$msg = SYS_DEBUG ? 'CSRF验证拦截(系统码'.$value.' / 提交码'.$post.'' : 'CSRF验证拦截';
SYS_DEBUG && log_message('debug', $msg);
dr_exit_msg(0, $msg, '', [
'name' => $token,
'value' => $value
]);
}
}
}
$app->$method();
if (CI_DEBUG) {
$tool = new \CodeIgniter\Debug\Toolbar(config(\Config\Toolbar::class));
$tool->prepare($this);
}
}
}