🔓 Ultimate Webshell - Penetration Testing Tool

📖 File Reader

<?php
declare (strict_types = 1);
namespace app;
use app\api\common\Common_user;
use think\App;
use think\exception\ValidateException;
use think\Validate;
use think\Facade\Db;
use think\facade\Config;
use think\facade\View;
use think\Image;

/**
 * 控制器基础类
 */
abstract class BaseController
{
    use \liliuwei\think\Jump;
    /**
     * Request实例
     * @var \think\Request
     */
    protected $request;

    /**
     * 应用实例
     * @var \think\App
     */
    protected $app;

    /**
     * 是否批量验证
     * @var bool
     */
    protected $batchValidate = false;

    /**
     * 控制器中间件
     * @var array
     */
    protected $middleware = [];

    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct(App $app)
    {
        $this->app     = $app;
        $this->request = $this->app->request;

        // 控制器初始化
        $this->initialize();
    }

    // 初始化
    protected function initialize()
    {

    }

    /**
     * 验证数据
     * @access protected
     * @param  array        $data     数据
     * @param  string|array $validate 验证器名或者验证规则数组
     * @param  array        $message  提示信息
     * @param  bool         $batch    是否批量验证
     * @return array|string|true
     * @throws ValidateException
     */
    protected function validate(array $data, $validate, array $message = [], bool $batch = false)
    {
        if (is_array($validate)) {
            $v = new Validate();
            $v->rule($validate);
        } else {
            if (strpos($validate, '.')) {
                // 支持场景
                [$validate, $scene] = explode('.', $validate);
            }
            $class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
            $v     = new $class();
            if (!empty($scene)) {
                $v->scene($scene);
            }
        }

        $v->message($message);

        // 是否批量验证
        if ($batch || $this->batchValidate) {
            $v->batch(true);
        }
        return $v->failException(true)->check($data);
    }

    /*返回数据*/
    public function tips($arr)
    {
        header("Content-Type:text/html; charset=utf-8");
        print_r(json_encode($arr));
    }

    /**
     * 返回数据成功
     * @param $msg 描述
     * @param $data 数据展示
     * @param $code 返回码
     */
    public function succeed_json($msg,$data=[],$code=200)
    {
        $arr["code"] = $code;
        $arr["msg"] = $msg;
        $arr["data"] = $data;
        print_r(json_encode($arr));
    }

    /**
     * 返回数据失败
     * @param $msg 描述
     * @param $code 返回码
     */
    public function error_json($msg,$code=400)
    {
        $arr["code"] = $code;
        $arr["msg"] = $msg;
        print_r(json_encode($arr));
    }

    /**
     * layui 表格数据返回
     * @param $count 表格总数量
     * @param $data 列表数据
     * @param $msg 描述
     * @param $code 返回码
     */
    public function layui_json($count= 0,$data=[],$msg='ok',$code=200)
    {
        $arr["code"] = $code;
        $arr["msg"] = $msg;
        $arr["count"] = $count;
        $arr["data"] = $data;
        print_r(json_encode($arr));
    }

    /**
     * 记录创建
     * @param $describe 记录描述
     * @param $type 记录类型
     * @param $user_id 会员id
     * @param $money 会员余额
     * @param $integral 会员积分
     * @param $freeze_money 冻结余额
     */
    public function record_log($describe,$type,$user_id,$money,$integral,$freeze_money=0)
    {
        $user_info = db::name("user")->where("user_id = $user_id")->field("money,integral,freeze_money")->find();
        //会员金额处理
        $info = [
            'money'=> $user_info["money"] + $money,
            'integral'=> $user_info["integral"] + $integral,
            'freeze_money'=>$user_info["freeze_money"] + $freeze_money,
        ];
        /*账户余额检测*/
        $user_money = Common_user::user_money($user_id);//会员可用余额
        $user_money = $user_money + $money;
        $data_error = [];
        if ($user_money < 0){$data_error = ['code'=>400,'msg'=>'余额不足'];}
        if ($info["integral"] < 0){$data_error = ['code'=>400,'msg'=>'积分不足'];}
        if ($info["freeze_money"] < 0){$data_error = ['code'=>400,'msg'=>'冻结余额不足'];}
        if (!empty($data_error)){
            print_r(json_encode($data_error));
            exit;
        }
        db::name("user")->where("user_id = $user_id")->data($info)->update();
        //创建记录
        $info2 = [
            'user_id'=>$user_id,
            'money'=>$money,
            'integral'=>$integral,
            'freeze_money'=>$freeze_money,
            'describe'=>$describe,
            'type'=>$type,
            'add_time'=>time(),
        ];
        db::name("record_log")->insertGetId($info2);
        return 1;
    }

    /**
     * 创建会员级别变动记录
     * @param $user_id 会员id
     * @param $rank_id 级别id
     * @param $primitive_rank_id 原始级别id
     */
    public function user_rank_upgrade_log($user_id,$rank_id,$primitive_rank_id)
    {
        $info = [
            'user_id'=>$user_id,
            'rank_id'=>$rank_id,
            'primitive_rank_id'=>$primitive_rank_id,
            'add_time'=>time(),
        ];
        db::name("user_rank_upgrade_log")->insertGetId($info);
        return 'ok';
    }

    /**
     * vue分页手写
     * @param $count 数量
     * @param $limit 每页页数
     * @param $page  分页页数
     */
    public function vue_page($count,$limit,$page)
    {
        $page_gong1 = $count / $limit;
        $page_gong = intval($page_gong1);//共几页
        if ($page_gong1 > $page_gong){
            $page_gong += 1;
        }
        $data["page_home"] = 1;//首页
        $data["page_s"] = $page -1;
        $data["page"] = $page;
        $data["page_x"] = $page +1;
        $data["page_weiye"] = $page_gong;//尾页
        $data["limit"] = $limit;
        return $data;
    }

    /**
     * 获取总页数
     * @param $count 总数量
     * @param $limit 每页行数
     */
    public function vue_pages($count,$limit)
    {
        $page_gong1 = $count / $limit;
        $page_gong = intval($page_gong1);//共几页
        if ($page_gong1 > $page_gong){
            $page_gong += 1;
        }
        return $page_gong;
    }

    /**
     * 后台操作日志
     * @param int $admin_id 管理员id
     * @param string $describe 简单描述
     * @param string $field_value 字段详细内容
     */
    public function system_admin_log($admin_id=0,$describe='',$field_value='')
    {
        $request_data = json_encode(input("param."));
        $ip = $this->get_client_ip();
        //$getCity = $ip != ''?$this->getCityByIP($ip):'';
        $getCity = '';
        $info = [
            'admin_id'=>$admin_id,
            'ip'=>$this->get_client_ip(),
            'request_url'=>$_SERVER['REQUEST_URI'],
            'request_data'=>$request_data,
            'describe'=>$describe,
            'field_value'=>json_encode($field_value),
            'time'=>date("Y-m-d H:i:s",time()),
            'time_add'=>time(),
        ];
        if (!empty($getCity)){
            $info["address"] = $getCity["country"].','.$getCity["regionName"].','.$getCity["city"];
        }
        db::name("system_admin_log")->insertGetId($info);
        return 'ok';
    }

    /*获得当前ip*/
    private function get_client_ip() {
        if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
            $ip = getenv('REMOTE_ADDR');
        } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
    }

    /*根据ip获取地址名称*/
    private function getCityByIP($ip)
    {
        $url = "http://ip-api.com/json/" . $ip.'?lang=zh-CN';
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);
        $data = json_decode($response, true);
        if ($data['status'] == 'success') {
            return $data;
        } else {
            return '';
        }
    }

    /**
     * 文件上传(单文件)
     * @param $name 字段名称
     */
    public function upload($name=''){
        // 获取表单上传文件 例如上传了001.jpg
        $file = request()->file($name);
        // 上传到本地服务器
        $fileSize = 1000000*500;//单位MB
        if ($file->getSize() > $fileSize) {
            $data = [
                'code'=>400,
                'msg'=>'上传失败,超出了文件限制的大小(上限500MB)!',
            ];
            print_r(json_encode($data));
            exit;
        }
        try {
            // 验证文件大小、后缀
            validate(['filesize:'.$fileSize.'|fileExt:jpg,jpeg,png,mp3,mp4,xlsx,xls'=>'image'])->check(['image' => $file]);
            // 将图片保存至本地
            $saveName = \think\facade\Filesystem::putFile($name, $file);
            $saveName = str_replace('\\', '/', $saveName);
            /*压缩*/
//            $path = dirname(dirname(__FILE__))."/public/uploads/".$saveName;
//            $getOriginalExtension = $file->getOriginalExtension();
//            if($getOriginalExtension == 'jpg' || $getOriginalExtension == 'png' || $getOriginalExtension == 'jpeg'){
//                 $image = \think\Image::open($path);
//                 //按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.png
//                 $image->thumb(1204, 1204)->save($path);
//            }
            return $saveName;
        } catch (\think\exception\ValidateException $e) {
            return fail($e->getMessage());
        }
    }

    /**
     * [将Base64图片转换为本地图片并保存]
     * @E-mial wuliqiang_aa@163.com
     * @TIME   2017-04-07
     * @WEB    http://blog.iinu.com.cn
     * @param  [Base64] $base64_image_content [要保存的Base64]
     * @param  [目录] $path [要保存的路径]
     */
    public function base64_image_content($base64_image_content, $path)
    {
        //匹配出图片的格式
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
            $type = $result[2];
            $new_file = dirname(dirname(__FILE__)).$path . "/" . date('Ymd', time()) . "/";
            if (!file_exists($new_file)) {
                //检查是否有该文件夹,如果没有就创建,并给予最高权限
                mkdir($new_file, 0700);
            }
            $name =  time() . ".{$type}";
            $new_file = $new_file .$name;
            if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))) {
                //return $new_file;
                return $path . "/" . date('Ymd', time()) . "/".$name;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /*数据库关联配置*/
    public function config_db(){
        //获取现有的数据库配置信息
        $config = Config::get('database');
        //新增数据库参数配置
        $config['connections']['tmp'] = [
            // 数据库类型
            'type'            => 'mysql',
            // 服务器地址
            'hostname'        => '114.55.92.99',
            // 数据库名
            'database'        => "3zzizuozhu",
            // 用户名
            'username'        => "3zzizuozhu",
            // 密码
            'password'        => "fbRbGxLYJ75H7TXE",
            // 数据库表前缀
            'prefix'          => 'ecs_',
            // 端口
            'hostport'        => '3306',
            // 数据库连接参数
            'params'            => [],
            // 数据库编码默认采用utf8
            'charset'           => 'utf8',
        ];
        //设置database参数为 修改过的database配置参数
        Config::set($config, 'database');
        return db::connect('tmp');
    }
}