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

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