|
- <?php
- /**
- * 处理外部请求变量的类
- *
- * 禁止此文件以外的文件出现 $_POST、$_GET、$_FILES变量及eval函数(用request::myeval )
- * 以便于对主要黑客攻击进行防范
- *
- * @version $Id: request.class.php 1 12:03 2010-10-28 tianya $
- * @package DedeCMS.Libraries
- * @copyright Copyright (c) 2020, 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;
- }
- }
|