php表单敏感字符过滤类

这篇文章主要介绍了php表单敏感字符过滤类及其用法实例,详细分析了表单生成与提交等环节针对敏感字符的过滤功能,是非常实用的技巧,需要的朋友可以参考下

本文实例讲述了php表单敏感字符过滤类及其用法。分享给大家供大家参考。具体分析如下:

  1. /**
  2. * 表单生成验证文件
  3. */
  4. $_form = new formHtmlFind();
  5. class formHtmlFind{
  6. /**
  7. * 输出表单函数
  8. * $formKey 表单键
  9. * $infoArray 更新时的原始信息数组
  10. */
  11. public function formHtml($array,$infoArray='')
  12. {
  13. // 检测数组是否存在
  14. if(emptyempty($array))return false;
  15. $newform = null;
  16. // 信息数组(更新信息)
  17. $this->infoArray = !emptyempty($infoArray)?$infoArray:array();
  18. $this->array['class'] = get_class_methods(get_class());
  19. foreach ($array as $key =>$arr)
  20. {
  21. // 键值转换为纯英文
  22. $key = preg_replace("/[^a-z]/i",'',$key);
  23. // 生成表单
  24. $newform .= $this->outputForm($arr,$key);
  25. }
  26. // 输出表单
  27. return $newform.$this->jsError();
  28. }
  29. /**
  30. * 生成表单函数
  31. */
  32. private function outputForm($arr,$key)
  33. {
  34. $value = null;
  35. if(emptyempty($arr))return false;
  36. // input Type
  37. $type = $key;
  38. // input NAME
  39. $name = trim($arr[0]);
  40. // input 初始值 不包含多选,单选类
  41. $value = (!emptyempty($this->infoArray[$name]))? trim($this->infoArray[$name]):trim($arr[1]);
  42. $value = emptyempty($this->post[$name])? $value :trim($this->post[$name]);
  43. // input Title
  44. $title = trim($arr[2]);
  45. // 样式
  46. $style = trim($arr[3]);
  47. if($key!=="hidden")
  48. {
  49. $dt = "
    {$title}
    ";
  50. // js错误提示
  51. $dd = "J{$name}">rn";
  52. }
  53. return (!preg_match("/checkbox|select|radio/i",$key))?
  54. $dt.$this->newInput($type,$name,$value,$style,$title).$dd:
  55. $this->formSelect($type,$name,$arr[1],$title,$style); // 多选类
  56. }
  57. /**
  58. * 提交数据检测
  59. */
  60. public function postForm($array)
  61. {
  62. // 检测数组是否存在
  63. if(emptyempty($array)||emptyempty($_POST))return false;
  64. $this->post = $_POST;
  65. $this->array['class'] = get_class_methods(get_class());
  66. foreach ($array as $key =>$arr)
  67. {
  68. // 键值转换为纯英文
  69. $key = preg_replace("/[^a-z]/i",'',$key);
  70. // 检测 注销file类表单
  71. if (!emptyempty($arr)&&'file' != $key)$newData[trim($arr[0])] = $this->postFind($arr,$key);
  72. }
  73. // 输出表单
  74. if(!emptyempty($this->error))
  75. {
  76. return false;
  77. }
  78. else return $newData;
  79. }
  80. /**
  81. * 生成表单
  82. */
  83. private function newInput($type,$name,$value,$style,$title)
  84. {
  85. switch ($type)
  86. {
  87. case 'text':
  88. // 单行文本
  89. return "text" name="{$name}" value="{$value}" {$style}/>";
  90. break;
  91. case 'password':
  92. //密码输入
  93. return "password" name="{$name}" {$style}/>";
  94. break;
  95. case '':
  96. //多行文本
  97. return "{$name}" {$style}/>{$value}";
  98. break;
  99. case 'hidden':
  100. // 隐藏
  101. return "hidden" name="{$name}" value="{$value}" {$style}/>";
  102. break;
  103. case 'file':
  104. // 文件上传
  105. return "file"name="{$name}" {$style}/>"; type= "
  106. break;
  107. case 'submit':
  108. // 提交
  109. return "submit" name="{$name}" value="$value" $style}/>";
  110. break;
  111. default:
  112. return "{$type}类型错误!!!";
  113. break;
  114. }
  115. }
  116. /**
  117. * 提交信息检测
  118. * 错误返回error
  119. */
  120. private function postFind($arr,$key)
  121. {
  122. if(emptyempty($arr))return false;
  123. $name = $title =$error =$find =$standard =null;
  124. // input NAME
  125. $name = trim($arr[0]);
  126. // input Title
  127. $title = trim($arr[2]);
  128. // 错误提示
  129. $error = trim($arr[4]);
  130. // 检测类型 Y N
  131. $find = trim($arr[5]);
  132. // 检测标准
  133. $standard = trim($arr[6]);
  134. //
  135. if(!emptyempty($standard))$this->error .=$this->ck_split($standard,$name,$title,$find,$error);
  136. // 转换为字符串
  137. if(is_array($this->post[$name]))$this->post[$name] = implode(",",$this->post[$name]);
  138. // 转义或其他转化
  139. $KKarray = array();
  140. if(preg_match("/Y|N/is",$find))
  141. {
  142. $KKarray = split("_", $find);
  143. // 转义或过滤
  144. $escape_filter = (!emptyempty($KKarray[1]))?'ck_'.$KKarray[1]:'';
  145. // 输出通过检测的合法数据
  146. $data = ($escape_filter)?$this->$escape_filter($this->post[$name]):$this->post[$name];
  147. }
  148. else $data = "";
  149. // 输出新的数据
  150. return $data;
  151. }
  152. /**
  153. * 多选类表单生成
  154. */
  155. private function formSelect($type,$name,$value,$title,$style)
  156. {
  157. $outform = null;
  158. // 触发更新和提交动作时的初始
  159. $nowvalue = (!emptyempty($this->post[$name]))?$this->post[$name]:$this->infoarray[$name];
  160. // 兼容多选的识别,转为数组
  161. if(!emptyempty($nowvalue))$valueArray = explode(",",$nowvalue);
  162. // 选项标题
  163. if(is_array($title))
  164. {
  165. array_unshift($title,'选择');
  166. $titarray = array_values($title);
  167. }else $titarray = explode("|",$title);
  168. // 选项值
  169. if(is_array($value))
  170. {
  171. array_unshift($value,'选择');
  172. $valarray = array_keys($value);
  173. if(emptyempty($title))$titarray = array_values($value);
  174. }
  175. else $valarray = explode("|",$value);
  176. // 取消表单的初始默认值
  177. if(!emptyempty($this->post)&&!emptyempty($this->infoArray))$value = preg_replace("/Y_/i",'',$value);
  178. foreach ($valarray as $key =>$varl)
  179. {
  180. // 非默认的识别
  181. if(!emptyempty($valueArray))$select = (in_array($varl,$valueArray))?'Y':'';
  182. // 判断是否为默认
  183. else $select = (eregi("Y_",$varl))? 'Y':'';
  184. if($key >'0')
  185. {
  186. $_title=($titarray[$key])? $titarray[$key]:$title;
  187. switch ($type)
  188. {
  189. case 'select':
  190. if('Y' == $select)$select = 'selected';
  191. $outform .= sprintf("%s"/>%srn"
  192. ,$select,preg_replace("/Y_/i",'',$varl),$_title);
  193. break;
  194. case 'radio':
  195. if('Y' == $select)$select = 'checked';
  196. $outform .= sprintf("rn",
  197. $_title,$select,$name,$varl,$style);
  198. break;
  199. case 'checkbox':
  200. if('Y' == $select)$select = 'checked';
  201. $outform .= sprintf("rn",$_title,$select,$name,$varl,$style);
  202. break;
  203. }
  204. $select =null;
  205. }
  206. }
  207. // 下拉选择
  208. if($type =='select')$outform = sprintf('%s',$name,$style,$outform);
  209. return sprintf("
    %s
    %sJ%s">
    rn",$titarray[0],$outform,$name);
  210. }
  211. /**
  212. * 表单验证 及全部 ck_类函数
  213. */
  214. private function ck_split($standard,$name,$title,$find,$error)
  215. {
  216. // 非必填缺省跳过
  217. if(eregi('N',$find) && emptyempty($this->post[$name]))return false;
  218. // 必填缺省检测
  219. if(eregi('Y',$find) && emptyempty($this->post[$name]))return "["J{$name}","$error"],";
  220. $t_error = null;
  221. // 多项检测
  222. $arr = explode(',',$standard);
  223. // POST数据检测
  224. if(!emptyempty($arr))foreach ($arr as $var)
  225. {
  226. if(trim($var)!='')
  227. {
  228. switch ($this->post)
  229. {
  230. case is_array($this->post[$name]):
  231. // 数组类的检测
  232. foreach ($this->post[$name] as $_var)
  233. {
  234. $t_error.= ($this->ck_open($_var,trim($var)))?"":$error;
  235. if($t_error)break;
  236. }
  237. break;
  238. default:
  239. $t_error.= ($this->ck_open($this->post[$name],trim($var)))?"":$error;
  240. break;
  241. }
  242. if($t_error)break;
  243. }
  244. }
  245. return ($t_error)? "["J{$name}","$t_error"],":"";
  246. }
  247. // 函数调用
  248. private function ck_open($string,$str)
  249. {
  250. $functi = $this->ck_detected($str);
  251. return ($this->$functi($string,$str))? true:false;
  252. }
  253. // 类型判断
  254. private function ck_detected($str)
  255. {
  256. $detect = (eregi("^[a-zA-Z]*$",$str))? "{$str}Detect":'lengthDetect';
  257. if(!in_array($detect,$this->array['class']))
  258. {
  259. location('index.php',$ck,' Lack of function !!!');
  260. }
  261. return $detect;
  262. }
  263. //-------------------------------------以下为检测函数可外部调用
  264. // 长度
  265. public function lengthDetect($string,$str){
  266. $len = split('-',trim($str));
  267. return (strlen($string) > ($len[0]-1) && strlen($string) < ($len[1]+1))? true:false;
  268. }
  269. // 价格
  270. public function moneyDetect($str){
  271. return preg_match("/^(-|+)?d+(.d+)?$/",$str);
  272. }
  273. // 邮件
  274. public function emailDetect($str){
  275. return preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $str);
  276. }
  277. // 网址
  278. public function urlDetect($str){
  279. return preg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/", $str);
  280. }
  281. // 数字型
  282. public function numDetect($str){
  283. return is_numeric($str);
  284. }
  285. // 中文
  286. public function cnDetect($str){
  287. return preg_match("/^[x7f-xff]+$/", $str);
  288. }
  289. // 字母
  290. public function enDetect($str){
  291. return preg_match("/^[A-Za-z]+$/", $str);
  292. }
  293. // 数字字母混合
  294. public function numenDetect($str){
  295. return preg_match("/^([a-zA-Z0-9_-])+$/",$str);
  296. }
  297. // 电话号码
  298. public function telDetect($str){
  299. return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);
  300. }
  301. // 敏感词
  302. public function keyDetect($str){
  303. return (!preg_match("/$badkey/i",$str));
  304. }
  305. //-----------------------------------------------------输出
  306. // 字符替换
  307. public function ck_filter($str){
  308. $str=(is_array($str))? implode(",",$str):$str;
  309. $str=nl2br($str); //将回车替换为
  310. $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式。
  311. //$str=str_replace(array(" ",'
  312. return $str;
  313. }
  314. // 转义
  315. function ck_escape($str)
  316. {
  317. if (!get_magic_quotes_gpc())return addslashes($str);
  318. return $str;
  319. }
  320. // MD5加密
  321. public function ck_md5($str){
  322. return MD5($str);
  323. }
  324. // base64加密
  325. public function ck_base64($str){
  326. return base64_encode($str);
  327. }
  328. // 时间
  329. function ck_time($str){
  330. // time_r() 来在公用函数文件
  331. if(!is_numeric($str))
  332. {
  333. return time_r($str);
  334. }
  335. else return $str;
  336. }
  337. // 有条件注销(数字)
  338. public function ck_cancel($str){
  339. return (!is_numeric($str))? $str:"";
  340. }
  341. // 无条件注销
  342. public function ck_delete(){
  343. return null;
  344. }
  345. // js错误提示
  346. private function jsError()
  347. {
  348. if(emptyempty($this->error))return false;
  349. return "
  350. <script language=javascript> rn var error = new Array(".trim($this->error,',').");
  351. rn for (i=0; i
  352. rn document.getElementById(error[0]).innerHTML=error[1];
  353. }rn </script>
  354. ";
  355. }
  356. }
  357. // 演示:
  358. $form[1] =array(
  359. 'text'=>array('title','','产品名称','size=40','产品名称不可缺少!','Y','cn,1-30'),
  360. 'text1'=>array('categories','','产品名称','','','Y_base64'),
  361. 'select'=>array('superiors','||1|2|Y_3','产品类别|选择|1|2|3','','必选项','Y'),
  362. 'radio'=>array('superiors1','|1|Y_2|3','产品xun|产品1|产品2|产品3','','必选项','Y'),
  363. 'checkbox'=>array('superiors2',array(1=>'11',2=>'22',3=>'33'),'','','必选项','Y'),
  364. 'file'=>array('ddd','','文件'),
  365. );
  366. $form =array (
  367. 'login' =>
  368. array (
  369. 'text' =>
  370. array (
  371. 0 => 'user',
  372. 1 => '',
  373. 2 => '用户名',
  374. 3 => 'size=20',
  375. 4 => '!',
  376. 5 => 'Y',
  377. 6 => 'numen,6-12',
  378. ),
  379. 'password' =>
  380. array (
  381. 0 => 'pass',
  382. 1 => '',
  383. 2 => '密 码',
  384. 3 => 'size=22',
  385. 4 => '密码格式错误!',
  386. 5 => 'Y_md5',
  387. 6 => 'numen,6-12',
  388. ),
  389. 'radio' =>
  390. array (
  391. 0 => 'time',
  392. 1 => '|7200|3600|1800',
  393. 2 => 'cookies有效时间|2小时|1小时|30分钟',
  394. 3 => '',
  395. 4 => '',
  396. 5 => 'N_delete',
  397. 6 => '',
  398. ),
  399. ),
  400. );
  401. // 表单提交效验
  402. $past = $_form->postForm($form['login']);
  403. $dd = array('title'=>'标题','categories'=>'类别');
  404. // $dd 为已有的信息(如更新时的信息输出) POST数据位内部处理具有优先权
  405. if(!emptyempty($past))
  406. {
  407. echo "
    
    "; 
  408. print_r($past);
  409. echo"";
  410. }
  411. echo ';
  412. echo $_form->formHtml($form['login'],$dd);
  413. echo '';

希望本文所述对大家的PHP程序设计有所帮助。这篇文章主要介绍了php表单敏感字符过滤类及其用法实例,详细分析了表单生成与提交等环节针对敏感字符的过滤功能,是非常实用的技巧,需要的朋友可以参考下。