国内流行的内容管理系统(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.

230 lines
6.3KB

  1. <?php
  2. if (!defined('DEDEINC')) exit('dedebiz');
  3. /**
  4. * 处理外部请求变量的类
  5. *
  6. * 禁止此文件以外的文件出现 $_POST、$_GET、$_FILES变量及eval函数(用request::myeval )
  7. * 以便于对主要黑客攻击进行防范
  8. *
  9. * @version $Id: request.class.php 1 12:03 2010-10-28 tianya $
  10. * @package DedeBIZ.Libraries
  11. * @copyright Copyright (c) 2022, DedeBIZ.COM
  12. * @license https://www.dedebiz.com/license
  13. * @link https://www.dedebiz.com
  14. */
  15. // REQUEST常量,用于判断是否启用REQUEST类
  16. define('DEDEREQUEST', TRUE);
  17. //简化 cls_request::item() 函数
  18. function Request($key, $df = '')
  19. {
  20. $GLOBALS['request'] = isset($GLOBALS['request']) ? $GLOBALS['request'] : new Request;
  21. if (!$GLOBALS['request']->isinit) {
  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. if (count($_r) > 0) {
  55. foreach ($_r as $k => $v) {
  56. if (preg_match('/^cfg_(.*?)/i', $k)) {
  57. continue;
  58. }
  59. $this->forms[$k] = $v;
  60. if ($_k == 'p') {
  61. $this->posts[$k] = $v;
  62. } else {
  63. $this->gets[$k] = $v;
  64. }
  65. }
  66. }
  67. }
  68. unset($_POST);
  69. unset($_GET);
  70. unset($_REQUEST);
  71. //处理cookie
  72. if (count($_COOKIE) > 0) {
  73. foreach ($_COOKIE as $k => $v) {
  74. if (preg_match('/^config/i', $k)) {
  75. continue;
  76. }
  77. $this->cookies[$k] = $v;
  78. }
  79. }
  80. //unset($_POST, $_GET);
  81. //上传的文件处理
  82. if (isset($_FILES) && count($_FILES) > 0) {
  83. $this->FilterFiles($_FILES);
  84. }
  85. $this->isinit = TRUE;
  86. //global变量
  87. //self::$forms['_global'] = $GLOBALS;
  88. }
  89. /**
  90. * 把 eval 重命名为 myeval
  91. */
  92. function MyEval($phpcode)
  93. {
  94. return eval($phpcode);
  95. }
  96. /**
  97. * 获得指定表单值
  98. */
  99. function Item($formname, $defaultvalue = '')
  100. {
  101. return isset($this->forms[$formname]) ? $this->forms[$formname] : $defaultvalue;
  102. }
  103. /**
  104. * 获得指定临时文件名值
  105. */
  106. function Upfile($formname, $defaultvalue = '')
  107. {
  108. return isset($this->files[$formname]['tmp_name']) ? $this->files[$formname]['tmp_name'] : $defaultvalue;
  109. }
  110. /**
  111. * 过滤文件相关
  112. */
  113. function FilterFiles(&$files)
  114. {
  115. foreach ($files as $k => $v) {
  116. $this->files[$k] = $v;
  117. }
  118. unset($_FILES);
  119. }
  120. /**
  121. * 移动上传的文件
  122. */
  123. function MoveUploadFile($formname, $filename, $filetype = '')
  124. {
  125. if ($this->IsUploadFile($formname)) {
  126. if (preg_match($this->filter_filename, $filename)) {
  127. return FALSE;
  128. } else {
  129. return move_uploaded_file($this->files[$formname]['tmp_name'], $filename);
  130. }
  131. }
  132. }
  133. /**
  134. * 获得文件的扩展名
  135. */
  136. function GetShortname($formname)
  137. {
  138. $filetype = strtolower(isset($this->files[$formname]['type']) ? $this->files[$formname]['type'] : '');
  139. $shortname = '';
  140. switch ($filetype) {
  141. case 'image/jpeg':
  142. $shortname = 'jpg';
  143. break;
  144. case 'image/pjpeg':
  145. $shortname = 'jpg';
  146. break;
  147. case 'image/gif':
  148. $shortname = 'gif';
  149. break;
  150. case 'image/png':
  151. $shortname = 'png';
  152. break;
  153. case 'image/xpng':
  154. $shortname = 'png';
  155. break;
  156. case 'image/wbmp':
  157. $shortname = 'bmp';
  158. break;
  159. default:
  160. $filename = isset($this->files[$formname]['name']) ? $this->files[$formname]['name'] : '';
  161. if (preg_match("/\./", $filename)) {
  162. $fs = explode('.', $filename);
  163. $shortname = strtolower($fs[count($fs) - 1]);
  164. }
  165. break;
  166. }
  167. return $shortname;
  168. }
  169. /**
  170. * 获得指定文件表单的文件详细信息
  171. */
  172. function GetFileInfo($formname, $item = '')
  173. {
  174. if (!isset($this->files[$formname]['tmp_name'])) {
  175. return FALSE;
  176. } else {
  177. if ($item == '') {
  178. return $this->files[$formname];
  179. } else {
  180. return (isset($this->files[$formname][$item]) ? $this->files[$formname][$item] : '');
  181. }
  182. }
  183. }
  184. /**
  185. * 判断是否存在上传的文件
  186. */
  187. function IsUploadFile($formname)
  188. {
  189. if (!isset($this->files[$formname]['tmp_name'])) {
  190. return FALSE;
  191. } else {
  192. return is_uploaded_file($this->files[$formname]['tmp_name']);
  193. }
  194. }
  195. /**
  196. * 检查文件后缀是否为指定值
  197. *
  198. * @param string $subfix
  199. * @return boolean
  200. */
  201. function CheckSubfix($formname, $subfix = 'csv')
  202. {
  203. if ($this->GetShortname($formname) != $subfix) {
  204. return FALSE;
  205. }
  206. return TRUE;
  207. }
  208. }