<?php
/**
 * 处理外部请求变量的类
 *
 * 禁止此文件以外的文件出现 $_POST、$_GET、$_FILES变量及eval函数(用request::myeval )
 * 以便于对主要黑客攻击进行防范
 *
 * @version        $Id: request.class.php 1 12:03 2010-10-28 tianya $
 * @package        DedeBIZ.Libraries
 * @copyright      Copyright (c) 2022, DedeBIZ.COM
 * @license        https://www.dedebiz.com/license
 * @link           https://www.dedebiz.com
 */
//REQUEST常量,用于判断是否启用REQUEST类
define('DEDEREQUEST', TRUE);

//简化 cls_request::item() 函数
function Request($key, $df = '')
{
    $GLOBALS['request'] = isset($GLOBALS['request']) ? $GLOBALS['request'] : new Request;
    if (!$GLOBALS['request']->isinit) {
        $GLOBALS['request']->Init();
    }
    return $GLOBALS['request']->Item($key, $df);
}
class Request
{

    var $isinit = false;
    //用户的cookie
    var $cookies = array();

    //把GET、POST的变量合并一块,相当于 _REQUEST
    var $forms = array();

    //_GET 变量
    var $gets = array();

    //_POST 变量
    var $posts = array();

    //用户的请求模式 GET 或 POST
    var $request_type = 'GET';

    //文件变量
    var $files = array();

    //严禁保存的文件名
    var $filter_filename = '/\.(php|pl|sh|js)$/i';

    /**
     * 初始化用户请求
     * 对于 post、get 的数据,会转到 selfforms 数组, 并删除原来数组
     * 对于 cookie 的数据,会转到 cookies 数组,但不删除原来数组
     */
    function Init()
    {
        global $_POST, $_GET;
        //处理post、get
        $formarr = array('p' => $_POST, 'g' => $_GET);
        foreach ($formarr as $_k => $_r) {
            if (count($_r) > 0) {
                foreach ($_r as $k => $v) {
                    if (preg_match('/^cfg_(.*?)/i', $k)) {
                        continue;
                    }
                    $this->forms[$k] = $v;
                    if ($_k == 'p') {
                        $this->posts[$k] = $v;
                    } else {
                        $this->gets[$k] = $v;
                    }
                }
            }
        }
        unset($_POST);
        unset($_GET);
        unset($_REQUEST);

        //处理cookie
        if (count($_COOKIE) > 0) {
            foreach ($_COOKIE as $k => $v) {
                if (preg_match('/^config/i', $k)) {
                    continue;
                }
                $this->cookies[$k] = $v;
            }
        }
        //unset($_POST, $_GET);

        //上传的文件处理
        if (isset($_FILES) && count($_FILES) > 0) {
            $this->FilterFiles($_FILES);
        }
        $this->isinit = TRUE;

        //global变量
        //self::$forms['_global'] = $GLOBALS;
    }

    /**
     * 把 eval 重命名为 myeval
     */
    function MyEval($phpcode)
    {
        return eval($phpcode);
    }

    /**
     * 获得指定表单值
     */
    function Item($formname, $defaultvalue = '')
    {
        return isset($this->forms[$formname]) ? $this->forms[$formname] :  $defaultvalue;
    }

    /**
     * 获得指定临时文件名值
     */
    function Upfile($formname, $defaultvalue = '')
    {
        return isset($this->files[$formname]['tmp_name']) ? $this->files[$formname]['tmp_name'] :  $defaultvalue;
    }

    /**
     * 过滤文件相关
     */
    function FilterFiles(&$files)
    {
        foreach ($files as $k => $v) {
            $this->files[$k] = $v;
        }
        unset($_FILES);
    }

    /**
     * 移动上传的文件
     */
    function MoveUploadFile($formname, $filename, $filetype = '')
    {
        if ($this->IsUploadFile($formname)) {
            if (preg_match($this->filter_filename, $filename)) {
                return FALSE;
            } else {
                return move_uploaded_file($this->files[$formname]['tmp_name'], $filename);
            }
        }
    }

    /**
     * 获得文件的扩展名
     */
    function GetShortname($formname)
    {
        $filetype = strtolower(isset($this->files[$formname]['type']) ? $this->files[$formname]['type'] : '');
        $shortname = '';
        switch ($filetype) {
            case 'image/jpeg':
                $shortname = 'jpg';
                break;
            case 'image/pjpeg':
                $shortname = 'jpg';
                break;
            case 'image/gif':
                $shortname = 'gif';
                break;
            case 'image/png':
                $shortname = 'png';
                break;
            case 'image/xpng':
                $shortname = 'png';
                break;
            case 'image/wbmp':
                $shortname = 'bmp';
                break;
            default:
                $filename = isset($this->files[$formname]['name']) ? $this->files[$formname]['name'] : '';
                if (preg_match("/\./", $filename)) {
                    $fs = explode('.', $filename);
                    $shortname = strtolower($fs[count($fs) - 1]);
                }
                break;
        }
        return $shortname;
    }

    /**
     * 获得指定文件表单的文件详细信息
     */
    function GetFileInfo($formname, $item = '')
    {
        if (!isset($this->files[$formname]['tmp_name'])) {
            return FALSE;
        } else {
            if ($item == '') {
                return $this->files[$formname];
            } else {
                return (isset($this->files[$formname][$item]) ? $this->files[$formname][$item] : '');
            }
        }
    }

    /**
     * 判断是否存在上传的文件
     */
    function IsUploadFile($formname)
    {
        if (!isset($this->files[$formname]['tmp_name'])) {
            return FALSE;
        } else {
            return is_uploaded_file($this->files[$formname]['tmp_name']);
        }
    }

    /**
     * 检查文件后缀是否为指定值
     *
     * @param  string  $subfix
     * @return boolean
     */
    function CheckSubfix($formname, $subfix = 'csv')
    {
        if ($this->GetShortname($formname) != $subfix) {
            return FALSE;
        }
        return TRUE;
    }
}