国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

255 lines
6.6KB

  1. <?php
  2. /**
  3. * 处理外部请求变量的类
  4. *
  5. * 禁止此文件以外的文件出现 $_POST、$_GET、$_FILES变量及eval函数(用request::myeval )
  6. * 以便于对主要黑客攻击进行防范
  7. *
  8. * @version $Id: request.class.php 1 12:03 2010-10-28 tianya $
  9. * @package DedeCMS.Libraries
  10. * @copyright Copyright (c) 2020, DedeBIZ.COM
  11. * @license https://www.dedebiz.com/license
  12. * @link https://www.dedebiz.com
  13. */
  14. // REQUEST常量,用于判断是否启用REQUEST类
  15. define('DEDEREQUEST', TRUE);
  16. //简化 cls_request::item() 函数
  17. function Request($key, $df='')
  18. {
  19. $GLOBALS['request'] = isset($GLOBALS['request'])? $GLOBALS['request'] : new Request;
  20. if (!$GLOBALS['request']->isinit)
  21. {
  22. $GLOBALS['request']->Init();
  23. }
  24. return $GLOBALS['request']->Item($key, $df);
  25. }
  26. class Request
  27. {
  28. var $isinit = false;
  29. //用户的cookie
  30. var $cookies = array();
  31. //把GET、POST的变量合并一块,相当于 _REQUEST
  32. var $forms = array();
  33. //_GET 变量
  34. var $gets = array();
  35. //_POST 变量
  36. var $posts = array();
  37. //用户的请求模式 GET 或 POST
  38. var $request_type = 'GET';
  39. //文件变量
  40. var $files = array();
  41. //严禁保存的文件名
  42. var $filter_filename = '/\.(php|pl|sh|js)$/i';
  43. /**
  44. * 初始化用户请求
  45. * 对于 post、get 的数据,会转到 selfforms 数组, 并删除原来数组
  46. * 对于 cookie 的数据,会转到 cookies 数组,但不删除原来数组
  47. */
  48. function Init()
  49. {
  50. global $_POST,$_GET;
  51. //处理post、get
  52. $formarr = array('p' => $_POST, 'g' => $_GET);
  53. foreach($formarr as $_k => $_r)
  54. {
  55. if( count($_r) > 0 )
  56. {
  57. foreach($_r as $k=>$v)
  58. {
  59. if( preg_match('/^cfg_(.*?)/i', $k) )
  60. {
  61. continue;
  62. }
  63. $this->forms[$k] = $v;
  64. if( $_k=='p' )
  65. {
  66. $this->posts[$k] = $v;
  67. } else {
  68. $this->gets[$k] = $v;
  69. }
  70. }
  71. }
  72. }
  73. unset($_POST);
  74. unset($_GET);
  75. unset($_REQUEST);
  76. //处理cookie
  77. if( count($_COOKIE) > 0 )
  78. {
  79. foreach($_COOKIE as $k=>$v)
  80. {
  81. if( preg_match('/^config/i', $k) )
  82. {
  83. continue;
  84. }
  85. $this->cookies[$k] = $v;
  86. }
  87. }
  88. //unset($_POST, $_GET);
  89. //上传的文件处理
  90. if( isset($_FILES) && count($_FILES) > 0 )
  91. {
  92. $this->FilterFiles($_FILES);
  93. }
  94. $this->isinit = TRUE;
  95. //global变量
  96. //self::$forms['_global'] = $GLOBALS;
  97. }
  98. /**
  99. * 把 eval 重命名为 myeval
  100. */
  101. function MyEval( $phpcode )
  102. {
  103. return eval( $phpcode );
  104. }
  105. /**
  106. * 获得指定表单值
  107. */
  108. function Item( $formname, $defaultvalue = '' )
  109. {
  110. return isset($this->forms[$formname]) ? $this->forms[$formname] : $defaultvalue;
  111. }
  112. /**
  113. * 获得指定临时文件名值
  114. */
  115. function Upfile( $formname, $defaultvalue = '' )
  116. {
  117. return isset($this->files[$formname]['tmp_name']) ? $this->files[$formname]['tmp_name'] : $defaultvalue;
  118. }
  119. /**
  120. * 过滤文件相关
  121. */
  122. function FilterFiles( &$files )
  123. {
  124. foreach($files as $k=>$v)
  125. {
  126. $this->files[$k] = $v;
  127. }
  128. unset($_FILES);
  129. }
  130. /**
  131. * 移动上传的文件
  132. */
  133. function MoveUploadFile( $formname, $filename, $filetype = '' )
  134. {
  135. if( $this->IsUploadFile( $formname ) )
  136. {
  137. if( preg_match($this->filter_filename, $filename) )
  138. {
  139. return FALSE;
  140. }
  141. else
  142. {
  143. return move_uploaded_file($this->files[$formname]['tmp_name'], $filename);
  144. }
  145. }
  146. }
  147. /**
  148. * 获得文件的扩展名
  149. */
  150. function GetShortname( $formname )
  151. {
  152. $filetype = strtolower(isset($this->files[$formname]['type']) ? $this->files[$formname]['type'] : '');
  153. $shortname = '';
  154. switch($filetype)
  155. {
  156. case 'image/jpeg':
  157. $shortname = 'jpg';
  158. break;
  159. case 'image/pjpeg':
  160. $shortname = 'jpg';
  161. break;
  162. case 'image/gif':
  163. $shortname = 'gif';
  164. break;
  165. case 'image/png':
  166. $shortname = 'png';
  167. break;
  168. case 'image/xpng':
  169. $shortname = 'png';
  170. break;
  171. case 'image/wbmp':
  172. $shortname = 'bmp';
  173. break;
  174. default:
  175. $filename = isset($this->files[$formname]['name']) ? $this->files[$formname]['name'] : '';
  176. if( preg_match("/\./", $filename) )
  177. {
  178. $fs = explode('.', $filename);
  179. $shortname = strtolower($fs[ count($fs)-1 ]);
  180. }
  181. break;
  182. }
  183. return $shortname;
  184. }
  185. /**
  186. * 获得指定文件表单的文件详细信息
  187. */
  188. function GetFileInfo( $formname, $item = '' )
  189. {
  190. if( !isset( $this->files[$formname]['tmp_name'] ) )
  191. {
  192. return FALSE;
  193. }
  194. else
  195. {
  196. if($item=='')
  197. {
  198. return $this->files[$formname];
  199. }
  200. else
  201. {
  202. return (isset($this->files[$formname][$item]) ? $this->files[$formname][$item] : '');
  203. }
  204. }
  205. }
  206. /**
  207. * 判断是否存在上传的文件
  208. */
  209. function IsUploadFile( $formname )
  210. {
  211. if( !isset( $this->files[$formname]['tmp_name'] ) )
  212. {
  213. return FALSE;
  214. }
  215. else
  216. {
  217. return is_uploaded_file( $this->files[$formname]['tmp_name'] );
  218. }
  219. }
  220. /**
  221. * 检查文件后缀是否为指定值
  222. *
  223. * @param string $subfix
  224. * @return boolean
  225. */
  226. function CheckSubfix($formname, $subfix = 'csv')
  227. {
  228. if( $this->GetShortname( $formname ) != $subfix)
  229. {
  230. return FALSE;
  231. }
  232. return TRUE;
  233. }
  234. }