Initial project files: BESCMS full source
This commit is contained in:
@@ -0,0 +1,163 @@
|
||||
<?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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user