HEX
Server: nginx/1.28.1
System: Linux 10-41-63-61 6.8.0-31-generic #31-Ubuntu SMP PREEMPT_DYNAMIC Sat Apr 20 00:40:06 UTC 2024 x86_64
User: www (1001)
PHP: 7.4.33
Disabled: passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
Upload Files
File: /www/wwwroot//www.elwrky.com/public/install/index.php
<?php
header('Content-type:text/html;charset=utf-8');
session_start();
//配置信息
$config = array(
    'version'     => '1.0.0',
    'indexPage'   => 'step1',
    'checkPage'   => 'step2',
    'createPage'  => 'step3',
    'importPage'  => 'step4',
    'endPage'     => 'step5-1',
    'errorPage'   => 'step5-2',
    'sqlDir'      => './database/',   //数据库所在目录
    'prefix'      => 'yzn_',          //默认表前缀
    'sqlName'     => 'install',
    'demoData'    => 'demo',          //演示数据文件名称
    'databaseUrl' => '../../config/database.php',//database.php文件地址
    'account'     => 'admin',         //默认账号
    'password'    => 'admin',        //默认密码
    'email'    => 'admin@admin.com',        //默认密码
    'limit'       =>'50',
);
//数据库配置
$db_config = array(
    'DB_HOST'   => '127.0.0.1',
    'DB_PORT'   => '3306',
    'DB_NAME'   => 'yzncms',
    'DB_PREFIX' => 'dzd_',
    'DB_USER'   => 'root',
    'DB_PASS'   => '',
);
//错误提示信息
$errorTitle = '出错了';
$errorMsg   = '';
//引入页面
$get = @$_GET['type'] ? $_GET['type'] : $config['indexPage'];
//检测是否已安装
if($get!='step5-1'){
    if (file_exists(dirname(dirname(dirname(__FILE__))).'/public/install/install.lock')) {
        $errorTitle = '系统已安装';
        $errorMsg   = '你已经安装过该系统,如需重新安装需要先删除 public/install/install.lock 和 config/database.php文件';
        die(require $config['errorPage'] . '.html');
    }
}
//数据库配置
if ($get == $config['importPage']) {
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $link  = @new mysqli("{$_POST['DB_HOST']}:{$_POST['DB_PORT']}", $_POST['DB_USER'], $_POST['DB_PASS']);
        $error = $link->connect_error;
        if (!is_null($error)) {
            $errorMsg = addslashes($error);
            die(require $config['errorPage'] . '.html');
        } else {
            $link->query("SET NAMES 'utf8'");
            $link->server_info > 5.0 or die("<script>alert('请将您的mysql升级到5.0以上');history.go(-1)</script>");
            $db_config['DB_HOST']   = $_POST['DB_HOST'];
            $db_config['DB_PORT']   = $_POST['DB_PORT'];
            $db_config['DB_NAME']   = $_POST['DB_NAME'];
            $db_config['DB_PREFIX'] = $_POST['DB_PREFIX'];
            $db_config['DB_USER']   = $_POST['DB_USER'];
            $db_config['DB_PASS']   = $_POST['DB_PASS'];
            $_SESSION['db']         = $db_config;
        }
    }
}

//开始安装
if ($get == $config['endPage']) {
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        $return = [
            'status'=>false,
            'msg'=>'安装失败',
            'data'=>[]
        ];

        if($_POST['type']=='1'){
            //连接数据库
            $db = $_SESSION['db'];
            $link = @new mysqli("{$db['DB_HOST']}:{$db['DB_PORT']}", $db['DB_USER'], $db['DB_PASS']);
            //获取错误信息
            $error = $link->connect_error;
            if (!is_null($error)) {
                $errorMsg = addslashes($error);
                $return['msg'] = $errorMsg;
                echoJson($return);
            }
            //设置字符集
            $link->query("SET NAMES 'utf8'");
            if($link->server_info < 5.5){
                $return['msg'] = '请将您的mysql升级到5.0以上';
                echoJson($return);
            }
            //创建数据库并选中
            if (!$link->select_db($db['DB_NAME'])) {
                $create_sql = 'CREATE DATABASE IF NOT EXISTS ' . $db['DB_NAME'] . ' DEFAULT CHARACTER SET utf8;';
                if (!$link->query($create_sql)) {
                    $return['msg'] = '创建数据库失败';
                    echoJson($return);
                }
                $link->select_db($db['DB_NAME']);
            }
            //导入sql数据并创建表
            if (!file_exists($sqlPath = $config['sqlDir'] . $config['sqlName'] . '.sql')) {
                $return['msg'] = '文件丢失:' . $sqlPath;
                echoJson($return);
            }
            // 获取数据
            $sql_str = file_get_contents($sqlPath);
            $sql_array = preg_split("/;[\r\n]+/", str_replace($config['prefix'], $db['DB_PREFIX'], $sql_str));
            $total_page = ceil(count($sql_array)/$config['limit']);
            $return['data']['page']=1;
            $return['data']['totalPage']=$total_page;
            $return['status'] = true;
            $return['msg'] = '安装中';
            $link->close();
            echoJson($return);
        }elseif($_POST['type']=='2'){
            $db = $_SESSION['db'];
            $link = @new mysqli("{$db['DB_HOST']}:{$db['DB_PORT']}", $db['DB_USER'], $db['DB_PASS']);
            //设置字符集
            $link->query("SET NAMES 'utf8'");
            $link->select_db($db['DB_NAME']);
            // 获取数据

            $sqlPath = $config['sqlDir'] . $config['sqlName'] . '.sql';
            $sql_str = file_get_contents($sqlPath);

            //修改表前缀
            $sql_array = preg_split("/;[\r\n]+/", str_replace($config['prefix'], $db['DB_PREFIX'], $sql_str));
            $start = ($_POST['page']-1)*$config['limit'];
            $end = $start+$config['limit'];
            //循环query
            $total_page = ceil(count($sql_array)/$config['limit']);
            if($_POST['page']<=$total_page){
                foreach ($sql_array as $k => $v) {
                    if($k>=$start && $k<$end){
                        if (!empty($v)) {
                            $link->query($v);
                        }
                    }
                }
            }
            $return['status'] = true;
            $return['msg'] = '安装中';
            $return['data']['page']      = $_POST['page'] + 1;
            $return['data']['totalPage'] = $total_page;
            $return['data']['percent']   = sprintf("%.2f", ($_POST['page'] / $total_page) * 100);
            $link->close();
            echoJson($return);
        }elseif($_POST['type']=='3'){//插入默认管理员账号
            $_SESSION['admin_account'] = $_POST['admin_account'];//账号
            $_SESSION['admin_password'] = $_POST['admin_password'];//密码

            $db = $_SESSION['db'];
            $link = @new mysqli("{$db['DB_HOST']}:{$db['DB_PORT']}", $db['DB_USER'], $db['DB_PASS']);
            //设置字符集
            $link->query("SET NAMES 'utf8'");
            $link->select_db($db['DB_NAME']);

            //插入数据库默认账号密码
            $account  = $_POST['admin_account'];
            $email  = $_POST['admin_email'];
            $time     = time();
            $auth_code = "xW5OhH";
            $password = md5($_POST['admin_password'].$auth_code);
            $add_admin_sql = "INSERT INTO `" . $db['DB_PREFIX'] . "admin` (`id`,`username`,`password`,`roleid`,`sites`,`encrypt`, `nickname`,`last_login_time`,`last_login_ip`,`email`,`token`,`status`) VALUES ('1','".$account."','" . $password . "','1','0','" . $auth_code . "','多站点'," . $time . ",'','" . $email . "','','1');";
            $link->query($add_admin_sql);
            //插入数据
            $return['data']['page']=1;
            $return['data']['totalPage']=1000;//临时给一个随便默认值
            $return['status'] = true;
            $return['msg'] = '安装中';
            $link->close();
            doWrite($config);
            echoJson($return);
        }elseif($_POST['type']=='4'){//安装演示数据
            $db = $_SESSION['db'];
            $link = @new mysqli("{$db['DB_HOST']}:{$db['DB_PORT']}", $db['DB_USER'], $db['DB_PASS']);
            //设置字符集
            $link->query("SET NAMES 'utf8'");
            $link->select_db($db['DB_NAME']);
            //判断是否添加演示数据
            $demoPath = $config['sqlDir'] . $config['demoData'] . '.sql';
            $demo_sql = file_get_contents($demoPath);
            //修改表前缀
            $demo_sql_array = preg_split("/;[\r\n]+/", str_replace($config['prefix'], $db['DB_PREFIX'], $demo_sql));
            $total_page = ceil(count($demo_sql_array)/$config['limit']);
            $start = ($_POST['page']-1)*$config['limit'];
            $end = $start+$config['limit'];
            //循环query
            if($_POST['page']<=$total_page){
                foreach ($demo_sql_array as $k => $v) {
                    if($k>=$start && $k<$end){
                        if (!empty($v)) {
                            $link->query($v);
                        }
                    }
                }
                $return['status'] = true;
                $return['msg'] = '安装中';
                $return['data']['page']      = $_POST['page'] + 1;
                $return['data']['totalPage'] = $total_page;
                $return['data']['percent']   = sprintf("%.2f", ($_POST['page'] / $total_page) * 100);
                $link->close();
                echoJson($return);
            }else{
                $return['status'] = true;
                $return['msg'] = '安装中';
                $return['data']['page']      = $_POST['page'] + 1;
                $return['data']['totalPage'] = $total_page;
                $return['data']['percent']   = sprintf("%.2f", ($_POST['page'] / $total_page) * 100);
                echoJson($return);
            }
        }
    }
}


//判断是否有该页面
if(file_exists($url = $get . '.html'))
{
    require $url;
}
else
{
    $errorMsg = '没有该安装页面:' . $url;
    die(require $config['errorPage'].'.html');
}

//写入文件
function doWrite($config){
    $db = $_SESSION['db'];
    $db_str = <<<php
<?php
return [
    // 数据库类型
    'type' => 'mysql',
    // 服务器地址
    'hostname' => '{$db['DB_HOST']}',
    // 数据库名
    'database' => '{$db['DB_NAME']}',
    // 用户名
    'username' => '{$db['DB_USER']}',
    // 密码
    'password' => '{$db['DB_PASS']}',
    // 端口
    'hostport' => '{$db['DB_PORT']}',
    // 连接dsn
    'dsn' => '',
    // 数据库连接参数
    'params' => [],
    // 数据库编码默认采用utf8mb4
    'charset' => 'utf8mb4',
    // 数据库表前缀
    'prefix' => '{$db['DB_PREFIX']}',
    // 数据库调试模式
    'debug' => true,
    // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
    'deploy' => 0,
    // 数据库读写是否分离 主从式有效
    'rw_separate' => false,
    // 读写分离后 主服务器数量
    'master_num' => 1,
    // 指定从服务器序号
    'slave_no' => '',
    // 是否严格检查字段是否存在
    'fields_strict' => true,
    // 数据集返回类型
    'resultset_type' => 'array',
    // 自动写入时间戳字段
    'auto_timestamp' => false,
    // 时间字段取出后的默认时间格式
    'datetime_format' => 'Y-m-d H:i:s',
    // 是否需要进行SQL性能分析
    'sql_explain' => false,
    // Query类
    'query' => '\\think\\db\\Query',
];
php;
    //数据库连接配置文件路径
    if (file_exists($config['databaseUrl'])) {
        //删除原配置文件
        unlink($config['databaseUrl']);
    }
    //创建数据库链接配置文件
    file_put_contents($config['databaseUrl'], $db_str);
    @touch(dirname(dirname(dirname(__FILE__))).'/public/install/install.lock');
}

// 返回json数据输出
function echoJson($data)
{
    echo json_encode($data,true);die();
}