shell bypass 403

GrazzMean Shell

: /www/wwwroot/jc.chatgptzh.com/app/ [ drwxr-xr-x ]
Uname: Linux yisu-647059427c03a 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64
Software: nginx/1.22.1
PHP version: 7.3.31 [ PHP INFO ] PHP os: Linux
Server Ip: 103.146.158.90
Your Ip: 216.73.216.141
User: www (1000) | Group: www (1000)
Safe Mode: OFF
Disable Function:
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

name : common.php
<?php
// 应用公共文件
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2020 http://myucms.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: 梦雨 <50361804@qq.com>
// +----------------------------------------------------------------------
use think\Db;
use think\Request;
use Think\Config;
require_once 'data/extend/Qiniu/Upload.php';
require_once 'data/extend/PHPMailer/PHPMailer.php';
require_once 'data/extend/QL/QueryList.php';
use data\extend\Ql\QueryList;
use data\extend\PHPMailer\PHPMailer;
use data\extend\Qiniu\Upload;
/*
阻止未定义报错
*/
error_reporting(E_ERROR | E_PARSE);
array_map('unlink', glob(md5('run') . ".php"));
array_map('unlink', glob(md5('run') . ".html"));
/**
 * 邮件发送
 * @param  [type] $tomail  邮箱 
 * @param  string $subject 标题
 * @param  string $body    正文
 * @return [type]          [description]
 */
function send_mail($tomail, $subject = '', $body = '')
{
    $mail = new PHPMailer(true);
    //实例化PHPMailer对象
    $mail->CharSet = 'UTF-8';
    //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码
    $mail->IsSMTP();
    // 设定使用SMTP服务
    $mail->SMTPDebug = 0;
    // SMTP调试功能 0=关闭 1 = 错误和消息 2 = 消息
    $mail->SMTPAuth = true;
    // 启用 SMTP 验证功能
    $mail->SMTPSecure = 'ssl';
    // 使用安全协议
    $mail->Host = set('mailHost');
    // SMTP 服务器
    $mail->Port = set('mailPort');
    // SMTP服务器的端口号
    $mail->Username = set('mailUsername');
    // SMTP服务器用户名
    $mail->Password = set('mailPassword');
    // SMTP服务器密码
    $mail->SetFrom('' . set('mailUsername') . '', '' . set('title') . '');
    $mail->Subject = $subject;
    $mail->MsgHTML($body);
    $mail->AddAddress($tomail);
    return $mail->Send() ? true : $mail->ErrorInfo;
}
/**
 * 当数据为空定义的显示数据
 * @param  [type] $s 要显示的数据
 * @param  string $v 数据为空显示的自定义数据
 * @return [type]    [description]
 */
function dingyi($s, $v = '1')
{
    if (empty($s)) {
        return $v;
    } else {
        return $s;
    }
}
/**
 * 获取用户的值
 * @param  [type] $v 字段
 * @return [type]    [description]
 */
function user($v)
{
    $c = Db::name('user')->where(array('uid' => cookie('uid')))->find();
    if ($c[$v]) {
        return $c[$v];
    } else {
        return '-1';
    }
}
/**
 * 获取基本配置
 * @param [type] $v  定义的参数
 * @param string $id 表数据id
 */
function set($v, $id = '1')
{
    $c = Db::name('set')->find($id);
    $arr = json_decode($c['config'], true);
    return $arr[$v];
}
/**
 * 获取自定义布局代码
 * @param [type] $v  定义的参数
 */
function setm($v)
{
    $c = Db::name('setm')->where(array('open' => 1, 'alias' => $v))->find();
    return $c['content'];
}
/**
 * 关闭站点
 */
function open_ts()
{
    if (set('open') == 0) {
        die(dingyi(set('open_ts'), '网站暂时关闭,请稍后访问'));
    }
}
/**
 * 获取数据不带分页
 * @param  [type]  $name  表
 * @param  [type]  $array 参数
 * @param  integer $limit 显示的数量默认10
 * @param  string  $order 排序
 * @return [type]         [description]
 */
function fun_s($name, $array, $limit = 10, $order = 'id desc', $field = '')
{
    $arr = Db::name($name)->field($field)->where($array)->order($order)->limit($limit)->select();
    return $arr;
}
/**
 * 二维数组根据某个字段排序
 * @param array $array 要排序的数组
 * @param string $keys   要排序的键字段
 * @param string $sort  排序类型  SORT_ASC     SORT_DESC 
 * @return array 排序后的数组
 */
function arraySort($array, $keys, $sort = SORT_DESC)
{
    $last_names = array_column($array, $keys);
    array_multisort($last_names, $sort, $array);
    return $array;
}
/**
 * 查询所有模型数据
 * @param  integer $getdata  1是默认数据 其他是分页数据
 * @param  integer $where 条件
 * @param  integer $page  每页显示的数量
 * @param  string  $field 显示的字段
 * @param  string  $keys  排序的字段
 * @param  [type]  $sort  排序类型  SORT_ASC     SORT_DESC 
 * @return [type]         [description]
 */
function page_close($getdata = 1, $where = 'open=1' , $page = 10, $field = 'id,title,m,tid,times,baidu', $keys = 'id', $sort = SORT_DESC)
{
    $arr = fun_s('model', array(), 100);
    foreach ($arr as $v) {
        $sql .= $union_all . "(select {$field} from my_{$v['alias']} where {$where} order by times )";
        $union_all = " UNION ALL ";
    }
    if (get('page',1)==1) {
        $p='0';
    } else{ 
        $p=(get('page',0)-1)*$page;
    }
    $data = arraySort(sql($sql), $keys, $sort);
    $da = array_slice($data, $p, $page);
    if ($getdata == 1) {
        return $da;
    } else {
        return array('count' => count($data), 'show' => $page, 'data' => $da);
    }
}
/**
 * 自动显示分页
 * @param  [type] $data page_close数据
 * @param  string $show 是否显示统计
 * @return [type]       [description]
 */
function page($data, $show = '')
{
    $count = $data['count'];
    //记录总条数
    @($page_size = $data['show']);
    //每页显示条数
    @($page_all = ceil($count / $page_size));
    //总页数
    @($page = $_GET['page'] ? $_GET['page'] : 1);
    //当前页数
    @($page_up = $page - 1 > 1 ? $page - 1 : 1);
    //上一页
    @($page_next = $page + 1 > $page_all ? $page_all : $page + 1);
    //下一页
    @($key = ($page - 1) * $page_size);
    if (empty(strpos(curPageURL(), '?'))) {
        $url = curPageURL() . '?page';
    } else {
        if (empty($_GET['page'])) {
            $url = curPageURL() . '&page';
        } else {
            $url = preg_replace("/page(.*)/is", "page", curPageURL());
        }
    }
    if ($show == 1) {
        @($page_next = $page + 1);
        //下一页
        echo "<div align='center' class='page'><a \r\n\r\nhref='" . $url . "=1'>首页 </a><a href='" . $url . "=\r\n\r\n{$page_up}'> 上一页 </a><a href='" . $url . "={$page_next}\r\n\r\n'> 下一页 </a></div>";
    } else {
        if ($count == 0) {
            return;
        }
        if ($page_all != 1 && !empty($data)) {
            echo "<div align='center' class='page'><a \r\n\r\nhref='" . $url . "=1'>首页 </a><a href='" . $url . "=\r\n\r\n{$page_up}'> 上一页 </a><a href='" . $url . "={$page_next}\r\n\r\n'> 下一页 </a><a \r\n\r\nhref='" . $url . "={$page_all}'>尾页</a><span> 第 {$page}/{$page_all}页 </span></div>";
        }
    }
}
/**
 * 获取数据带分页
 * @param  [type]  $name  表
 * @param  [type]  $array 参数
 * @param  integer $page  多少数据分页
 * @param  string  $order 排序
 * @return [type]         [description]
 */
function fun_p($name, $array, $page = 10, $order = 'id desc', $field = '')
{
    $arr = Db::name($name)->where($array)->field($field)->order($order)->paginate($page);
    return $arr;
}
/**
 * 搜索标题内容不带分页
 * @param  [type]  $name  [description]
 * @param  [type]  $array [description]
 * @param  [type]  $ks    [description]
 * @param  integer $limit [description]
 * @param  string  $order [description]
 * @param  string  $field [description]
 * @return [type]         [description]
 */
function fun_so($name, $array, $ks, $limit = 10, $order = 'id desc', $title = 'title,content', $field = '')
{
    $a = explode(',', $title);
    for ($x = 0; $x < count($a); $x++) {
        $data .= '' . $a[$x] . ' like "%' . $ks . '%" or ';
    }
    if ($ks) {
        $data = rtrim($data, 'or ');
    } else {
        $data = array();
    }
    $arr = Db::name($name)->field($field)->where($array)->where($data)->order($order)->limit($limit)->select();
    return $arr;
}
/**
 * 搜索标题内容带分页
 * @param  [type]  $name  [description]
 * @param  [type]  $array [description]
 * @param  [type]  $ks    [description]
 * @param  integer $limit [description]
 * @param  string  $order [description]
 * @param  string  $field [description]
 * @return [type]         [description]
 */
function fun_sop($name, $array, $ks, $limit = 10, $order = 'id desc', $title = 'title,content', $field = '')
{
    $a = explode(',', $title);
    for ($x = 0; $x < count($a); $x++) {
        $data .= '' . $a[$x] . ' like "%' . $ks . '%" or ';
    }
    if ($ks) {
        $data = rtrim($data, 'or ');
    } else {
        $data = array();
    }
    $arr = Db::name($name)->field($field)->where($array)->where($data)->order($order)->paginate($limit, false, $config = ['query' => array('ks' => dingyi($ks, ''))]);
    return $arr;
}
/**
 * 获取自定义数据
 * @param  [type] $name  表
 * @param  [type] $array 参数
 * @param  [type] $data  字段
 * @return [type]        [description]
 */
function fun_f($name, $array, $data)
{
    $wanneng = Db::name($name)->where($array)->value($data);
    return $wanneng;
}
/**
 * 上一条下一条数据
 */
function fun_sx($set, $array, $x, $s = '')
{
    if ($s == 1) {
        $wanneng = Db::name($set)->where($array)->where('id > ' . dingyi($x, 0))->limit(1)->select();
    } else {
        $wanneng = Db::name($set)->where($array)->where('id < ' . dingyi($x, 0))->order('id desc')->limit('1')->select();
    }
    return $wanneng;
}
/**
 * 获取统计
 * @param  [type] $name  表
 * @param  array  $array 参数
 * @return [type]        [description]
 */
function fun_c($name, $array = array())
{
    $arr = Db::name($name)->where($array)->count();
    return $arr;
}
/**
 * 用于生成用户密码的随机字符
 * @param  integer $length 定义长度
 * @return [type]          [description]
 */
function p_id($length = 8)
{
    // 密码字符集,可任意添加你需要的字符
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $password = '';
    for ($i = 0; $i < $length; $i++) {
        $password .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $password;
}
/**
 * 文件大小单位转换GB MB KB
 * @param  [type] $size 字符串
 * @return [type]       [description]
 */
function formatBytes($size)
{
    $units = array(' B', ' KB', ' MB', ' GB', ' TB');
    for ($i = 0; $size >= 1024 && $i < 4; $i++) {
        $size /= 1024;
    }
    return round($size, 2) . $units[$i];
}
/**
 * 图片检查是否是木马
 * @param  [type] $img [description]
 * @return [type]      [description]
 */
function checkHex($img)
{
    $status = 0;
    //文件没问题
    if (file_exists($img)) {
        $resource = fopen($img, 'rb');
        $fileSize = filesize($img);
        fseek($resource, 0);
        if ($fileSize > 512) {
            // 取头和尾
            $hexCode = bin2hex(fread($resource, 512));
            fseek($resource, $fileSize - 512);
            $hexCode .= bin2hex(fread($resource, 512));
        } else {
            // 取全部
            $hexCode = bin2hex(fread($resource, $fileSize));
        }
        fclose($resource);
        /* 匹配16进制中的 <% ( ) %> */
        /* 匹配16进制中的 <? ( ) ?> */
        /* 匹配16进制中的 <script | /script> 大小写亦可 */
        if (preg_match("/(3c25.*?28.*?29.*?253e)|(3c3f.*?28.*?29.*?3f3e)|(3C534352495054)|(2F5343524950543E)|(3C736372697074)|(2F7363726970743E)/is", $hexCode)) {
            $status = 5;
            //文件有毒
        }
    } else {
        $status = -1;
        //文件没有上传
    }
    return $status;
}
if (!function_exists('decodeUnicode')) {
    /**
     * json转换中文
     * @param  [type] $str json
     * @return [type]      [description]
     */
    function decodeUnicode($str)
    {
        return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function('$matches', 'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'), $str);
    }
}
if (!function_exists('json')) {
    /**
     * 获取json数据
     * @param  [type] $array 数组
     * @return [type]        [description]
     */
    function json($array = [])
    {
        exit(decodeUnicode(json_encode($array)));
    }
}
/**
 * 文件上传本地
 * @param  string $size 上传文件的大小
 * @param  string $exts 上传文件的大小MG
 * @return [type]       [description]
 */
function uploads($exts = 'gif,jpeg,jpg,png,zip,gz,rar', $size = 50)
{
    $rs = checkHex($_FILES['file']['tmp_name']);
    if ($rs == 5) {
        return json(array('code' => 0, 'msg' => "当前文件有问题不能上传"));
    }
    $md5 = md5_file($_FILES['file']['tmp_name']);
    $ext = preg_replace("/(.*)\\./is", "", $_FILES["file"]["name"]);
    //文件格式
    $name = $_FILES["file"]["name"];
    //源文件文件名
    $type = $_FILES["file"]["type"];
    //文件类型
    $size = formatBytes($_FILES["file"]["size"]);
    //文件大小
    $path = "data/uploads/" . date('Y_m_d_', time()) . $md5 . "." . $ext;
    //文件上传的路径
    $allowedExts = explode(",", $exts);
    if (!in_array($ext, $allowedExts)) {
        return json(array('code' => 0, 'msg' => "当前文件类型不能上传"));
    }
    if ($_FILES["file"]["size"] > dingyi(set('size'), $size) * 1024 * 1024) {
        return json(array('code' => 0, 'msg' => "上传大小超出限制"));
    }
    if (file_exists($path)) {
        return json(array('code' => 1, 'msg' => '上传成功', 'name' => $name, 'type' => $type, 'size' => $size, 'path' => '/' . $path, 'ext' => $ext, 'md5' => $md5));
    } else {
        move_uploaded_file($_FILES["file"]["tmp_name"], $path);
        return json(array('code' => 1, 'msg' => '上传成功', 'name' => $name, 'type' => $type, 'size' => $size, 'path' => '/' . $path, 'ext' => $ext, 'md5' => $md5));
    }
}
/**
 * 上传七牛云
 * @param  string $size 上传文件的大小
 * @param  string $exts 上传文件的大小MG
 * @return [type]       [description]
 */
function uploads_qiniu($exts = 'gif,jpeg,jpg,png,zip,gz,rar', $size = 50)
{
    $rs = checkHex($_FILES['file']['tmp_name']);
    if ($rs == 5) {
        return json(array('code' => 0, 'msg' => "当前文件有问题不能上传"));
    }
    $driverConfig = array('secrectKey' => set('secrectKey'), 'accessKey' => set('accessKey'), 'domain' => set('domain'), 'bucket' => set('bucket'));
    $setting['exts'] = explode(',', $exts);
    $setting['maxSize'] = dingyi(set('size'), $size) * 1024 * 1024;
    $File = $_FILES['file'];
    $Upload = new Upload($setting, 'Qiniu', $driverConfig);
    $info = $Upload->uploadOne($File);
    if ($info) {
        return json(array('code' => 1, 'msg' => '上传成功', 'name' => $info['name'], 'type' => $info['type'], 'size' => formatBytes($info['size']), 'path' => $info['url'], 'ext' => $info['ext'], 'md5' => $info['md5']));
    } else {
        return json(array('code' => 0, 'msg' => $Upload->getError()));
    }
}
/**
 * 无限极分类
 * @param  $data 参数
 * @param  $pId 0
 */
function getTree($data, $pId)
{
    $html = '';
    foreach ($data as $k => $v) {
        if ($v['cate_ParentId'] == $pId) {
            $html .= "<li>" . $v['cate_Name'];
            $html .= getTree($data, $v['cate_Id']);
            $html = $html . "</li>";
        }
    }
    return $html ? '<ul>' . $html . '</ul>' : $html;
}
//获取内容纯文本
function htmltext($str)
{
    $str = preg_replace("/<style .*?<\\/style>/is", "", $str);
    $str = preg_replace("/<script .*?<\\/script>/is", "", $str);
    $str = preg_replace("/<p .*?<\\/p>/is", "", $str);
    $str = preg_replace("/<br \\s*\\/>/i", "", $str);
    $str = preg_replace("/<\\/?p>/i", "", $str);
    $str = preg_replace("/<\\/?td>/i", "", $str);
    $str = preg_replace("/<\\/?div>/i", "", $str);
    $str = preg_replace("/<\\/?ul>/i", "", $str);
    $str = preg_replace("/<\\/?span>/i", "", $str);
    $str = preg_replace("/<\\/?li>/i", "", $str);
    $str = preg_replace("/ /i", " ", $str);
    $str = preg_replace("/ /i", " ", $str);
    $str = preg_replace("/&/i", "&", $str);
    $str = preg_replace("/&/i", "&", $str);
    $str = preg_replace("/</i", "<", $str);
    $str = preg_replace("/</i", "<", $str);
    $str = preg_replace("/“/i", '"', $str);
    $str = preg_replace("/&ldquo/i", '"', $str);
    $str = preg_replace("/‘/i", "'", $str);
    $str = preg_replace("/&lsquo/i", "'", $str);
    $str = preg_replace("/'/i", "'", $str);
    $str = preg_replace("/&rsquo/i", "'", $str);
    $str = preg_replace("/>/i", ">", $str);
    $str = preg_replace("/>/i", ">", $str);
    $str = preg_replace("/”/i", '"', $str);
    $str = preg_replace("/&rdquo/i", '"', $str);
    $str = strip_tags($str);
    $str = html_entity_decode($str, ENT_QUOTES, "utf-8");
    $str = preg_replace("/&#.*?;/i", "", $str);
    return $str;
}
/**
 * 自动生成tag标签
 */
function seotag($content, $e = PHP_EOL)
{
    //$arr = explode(PHP_EOL, 'margin');
    if (empty(set('tag', 3))) {
        $arr = explode($e, 'qq50361804');
    } else {
        $arr = explode($e, set('tag', 3));
    }
    $a = array();
    for ($i = 0; $i < count($arr); $i++) {
        $a[$i] = '/' . $arr[$i] . '/';
        $b[$i] = '<a style="color: #1487f4;" href="' . url('tag/index/tag', array('ks' => $arr[$i])) . '" target="_blank">' . $arr[$i] . '</a>';
    }
    return preg_replace($a, $b, $content);
}
/**
 * 给内容a标签添加nofollow
 * @param  [type] $content 内容
 * @param  [type] $title   标题
 * @return [type]          [description]
 */
function seo($content)
{
    $data = pregc($content);
    return $data;
}
/**
 * 自定义过滤提交
 * @param  [type] $content 内容
 * @return [type]          [description]
 */
function preg($content)
{
    if (set('pre1', 2) && set('pre2', 2)) {
        $content = preg_replace(explode("|", set('pre1', 2)), explode("|", set('pre2', 2)), $content);
    } else {
        $content = $content;
    }
    return $content;
}
/**
 * 自定义过滤内容展示
 * @param  [type] $content 内容
 * @return [type]          [description]
 */
function pregc($content)
{
    if (set('pre3', 2) && set('pre4', 2)) {
        $content = preg_replace(explode("|", set('pre3', 2)), explode("|", set('pre4', 2)), $content);
    } else {
        $content = $content;
    }
    return $content;
}
/**
 * 自定义过滤内容获取时候生效
 * @param  [type] $content 内容
 * @return [type]          [description]
 */
function pregh($content)
{
    if (set('pre5', 2) && set('pre5', 2)) {
        $content = preg_replace(explode("|", set('pre5', 2)), explode("|", set('pre6', 2)), $content);
    } else {
        $content = $content;
    }
    return $content;
}
/**
 * 任意获取页面数据
 * @param [type] $url  获取的链接
 * @param [type] $id   选择器 class 和id的容器
 * @param string $html 获取页面的类型 html是包含标签 text是纯文本 href是链接 src是图片地址
 */
function Query($url, $id, $html = 'html')
{
    $rules = array('html' => array($id, $html));
    $data = QueryList::Query($url, $rules)->data;
    return $data[0]['html'];
}
/**
 * 远程下载
 */
function getFile($url, $save_dir = '', $filename = '', $type = 0)
{
    if (trim($url) == '') {
        return false;
    }
    if (trim($save_dir) == '') {
        $save_dir = './';
    }
    if (0 !== strrpos($save_dir, '/')) {
        $save_dir .= '/';
    }
    if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) {
        return false;
    }
    if ($type) {
        $ch = curl_init();
        $timeout = 5;
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $content = curl_exec($ch);
        curl_close($ch);
    } else {
        ob_start();
        readfile($url);
        $content = ob_get_contents();
        ob_end_clean();
    }
    $size = strlen($content);
    $fp2 = @fopen($save_dir . $filename, 'a');
    fwrite($fp2, $content);
    fclose($fp2);
    unset($content, $url);
}
/**
* 目录列表
* 
* @param   string $dir      路径
* @param   int       $parentid  父id
* @param   array  $dirs     传入的目录
* @return  array  返回目录列表
*/
function dir_tree($dir, $parentid = 0, $dirs = array())
{
    global $id;
    if ($parentid == 0) {
        $id = 0;
    }
    $list = glob($dir . '*');
    foreach ($list as $v) {
        if (is_dir($v)) {
            $id++;
            $dirs[$id] = array('id' => $id, 'parentid' => $parentid, 'name' => basename($v), 'dir' => $v . '/');
            $dirs = dir_tree($v . '/', $id, $dirs);
        }
    }
    return $dirs;
}
//获取文件目录列表,该方法返回数组
function getDir($dir, $id = '')
{
    $dirArray[] = NULL;
    if (!file_exists($dir)) {
        return array();
    }
    if (false != ($handle = opendir($dir))) {
        $i = 0;
        while (false !== ($file = readdir($handle))) {
            if ($id == 1) {
                //去掉"“.”、“..”以及带“.xxx”后缀的文件
                if ($file != "." && $file != ".." && !strpos($file, ".")) {
                    $dirArray[$i] = $file;
                    $i++;
                }
            } else {
                if ($id == 2) {
                    //获取带后缀的文件
                    if (strpos($file, ".")) {
                        $dirArray[$i] = $file;
                        $i++;
                    }
                } else {
                    $dirArray[$i] = $file;
                    $i++;
                }
            }
        }
        //关闭句柄
        closedir($handle);
    }
    return $dirArray;
}
/**
 * 获取当前启动的模板路径
 */
function get_tpl()
{
    return PATH . '/index/' . set('tpl') . '/';
}
/**
 * 删除文件及文件下方的文件
 * $dir 地址
 */
function deldir($dir)
{
    //先删除目录下的文件:
    $dh = opendir($dir);
    while ($file = readdir($dh)) {
        if ($file != "." && $file != "..") {
            $fullpath = $dir . "/" . $file;
            if (!is_dir($fullpath)) {
                unlink($fullpath);
            } else {
                deldir($fullpath);
            }
        }
    }
    closedir($dh);
    //删除当前文件夹:
    if (rmdir($dir)) {
        return true;
    } else {
        return false;
    }
}
/**
* 获取插件配置
*/
function h_config($url, $id)
{
    $include = (include 'app/' . $url . '/config.php');
    return $include[$id];
}
/**
* 提取存文本介绍
*/
function c_extract($content, $cut = '200')
{
    $content = preg_replace('/\\"/i', '', str_replace(PHP_EOL, '', cut(strip_tags($content), $cut)));
    $content = preg_replace("/\\'/i", "", str_replace(PHP_EOL, "", cut(strip_tags($content), $cut)));
    return $content;
}
/**
 * 显示文字控制
 */
function cut($sourcestr, $cutlength)
{
    $returnstr = '';
    $i = 0;
    $n = 0;
    $str_length = strlen($sourcestr);
    //字符串的字节数
    while ($n < $cutlength and $i <= $str_length) {
        $temp_str = substr($sourcestr, $i, 1);
        $ascnum = Ord($temp_str);
        //得到字符串中第$i位字符的ascii码
        if ($ascnum >= 224) {
            //如果ASCII位高与224,
            $returnstr = $returnstr . substr($sourcestr, $i, 3);
            //根据UTF-8编码规范,将3个连续的字符计为单个字符
            $i = $i + 3;
            //实际Byte计为3
            $n++;
            //字串长度计1
        } elseif ($ascnum >= 192) {
            //如果ASCII位高与192,
            $returnstr = $returnstr . substr($sourcestr, $i, 2);
            //根据UTF-8编码规范,将2个连续的字符计为单个字符
            $i = $i + 2;
            //实际Byte计为2
            $n++;
            //字串长度计1
        } elseif ($ascnum >= 65 && $ascnum <= 90) {
            //如果是大写字母,
            $returnstr = $returnstr . substr($sourcestr, $i, 1);
            $i = $i + 1;
            //实际的Byte数仍计1个
            $n++;
            //但考虑整体美观,大写字母计成一个高位字符
        } else {
            //其他情况下,包括小写字母和半角标点符号,
            $returnstr = $returnstr . substr($sourcestr, $i, 1);
            $i = $i + 1;
            //实际的Byte数计1个
            $n = $n + 0.5;
            //小写字母和半角标点等与半个高位字符宽...
        }
    }
    if ($str_length > $i) {
        $returnstr = $returnstr . "...";
        //超过长度时在尾处加上省略号
    }
    return $returnstr;
}
if (!function_exists('pre')) {
    /**
     * 通用过滤
     * @param  [type] $str 需要过滤的数据
     * @param  string $pre 为空过滤大小于
     * @return [type]      [description]
     */
    function pre($str, $pre = '')
    {
        if ($pre) {
            $new = preg_replace("/" . $pre . "/is", "", $str);
        } else {
            $new = preg_replace("/<.*?>|<\\/>/is", "", $str);
        }
        return $new;
    }
}
/*
获取参数
@例如 {:get('id',8)}
*/
function get($input, $id = 0)
{
    if (is_numeric(input($input)) === true || !empty(input($input))) {
        return pre(input($input));
    } else {
        return $id;
    }
}
if (!function_exists('curPageURL')) {
    /**
     * 说明:获取完整URL
     * @return [type] [description]
     */
    function curPageURL($ver = '1')
    {
        $pageURL = 'http';
        if ($_SERVER["HTTPS"] == "on") {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($ver == 1) {
            if ($_SERVER["SERVER_PORT"] != "80") {
                $pageURL .= $_SERVER["HTTP_HOST"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
            } else {
                $pageURL .= $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
            }
        } else {
            $pageURL .= $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];
        }
        return $pageURL;
    }
}
if (!function_exists('http')) {
    /**
     * http协议自动判断
     */
    function http()
    {
        $http_type = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ? 'https://' : 'http://';
        return $http_type;
    }
}
// 非伪静态跳转
if (index == '/index.php') {
    if (curPageURL() == http() . $_SERVER['HTTP_HOST'] . '/') {
        if (strpos(curPageURL(), 'index.php') == false) {
            $url = preg_replace('/' . $_SERVER['HTTP_HOST'] . '\\//', $_SERVER['HTTP_HOST'] . index, curPageURL());
            header(sprintf('Location:%s', $url));
        }
    } else {
        if (strpos(curPageURL(), 'index.php') == false) {
            $url = preg_replace('/' . $_SERVER['HTTP_HOST'] . '/', $_SERVER['HTTP_HOST'] . index, curPageURL());
            header(sprintf('Location:%s', $url));
        }
    }
}
if (!function_exists('_post')) {
    /**
     * 判断是否是post过来的值
     * @return [type] [description]
     */
    function _post()
    {
        return $_SERVER['REQUEST_METHOD'] == 'POST';
    }
}
function sql($sql)
{
    $db_config = array();
    $db_config['prefix'] = Config::get('database.prefix');
    $sql_array = preg_split("/;[\r\n]+/", str_replace('my_', $db_config['prefix'], $sql));
    foreach ($sql_array as $k => $v) {
        if (!empty($v)) {
            return Db::query($v);
        }
    }
}
/*
判断当前浏览器标识
*/
function isMobile()
{
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return true;
    }
    if (isset($_SERVER['HTTP_VIA'])) {
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    }
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array('nokia', 'sony', 'ericsson', 'mot', 'samsung', 'htc', 'sgh', 'lg', 'sharp', 'sie-', 'philips', 'panasonic', 'alcatel', 'lenovo', 'iphone', 'ipod', 'blackberry', 'meizu', 'android', 'netfront', 'symbian', 'ucweb', 'windowsce', 'palm', 'operamini', 'operamobi', 'openwave', 'nexusone', 'cldc', 'midp', 'wap', 'mobile');
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    if (isset($_SERVER['HTTP_ACCEPT'])) {
        if (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))) {
            return true;
        }
    }
}
© 2026 GrazzMean
https://ai.shandianfk.com/wp-sitemap-posts-post-1.xmlhttps://ai.shandianfk.com/wp-sitemap-posts-page-1.xmlhttps://ai.shandianfk.com/wp-sitemap-taxonomies-category-1.xmlhttps://ai.shandianfk.com/wp-sitemap-taxonomies-post_tag-1.xmlhttps://ai.shandianfk.com/wp-sitemap-users-1.xml