频道栏目
首页 > 资讯 > 正则表达式 > 正文

正则应用实例-用户输入数据过滤

16-01-07        来源:[db:作者]  
收藏   我要投稿
通常php可以通过以下方式接受用户提交的数据表单POST和地址栏的GET两种途径,无论哪一种路径,我们都不能信任用户输入的数据,都要通过程序进行过滤。下面给出常用的数据过滤函数。
平板视图
打印
01	 functioninitUserInput()
02	 {
03	     $_data=array($_GET,$_POST,$_COOKIE);
04	     $data=array();
05	     foreach($_dataAS$input)
06	     {
07	         if(is_array($input))
08	         {
09	             foreach($inputas$k=>$v)
10	             {
11	                 $k= filter_key($k);
12	                 //做了二维数组的过滤 三维没有考虑
13	                 if(is_array($v))
14	                 {
15	                     foreach($vas$k1=>$v1)
16	                     {
17	                         $k1= filter_key($k1);
18	                         $return[$k][$k1] = filter_value($v1);
19	                     }
20	                 }
21	                 else
22	                 {
23	                     $return[$k] = filter_value($v);
24	                 }
25	             }
26	         }
27	     }
28	     //禁止超全局变量
29	     unset($_GET,$_POST,$_COOKIE);
30	     return$data;
31	 }
32	 //过滤超全局变量的键 其实是地址栏的参数名和表单的名称
33	 functionfilter_key($key)
34	 {
35	     if(is_numeric($key))
36	     {
37	         return$key;
38	     }
39	     elseif(empty($key))
40	     {
41	         return'';
42	     }
43	     //过滤'..' 这和系统的目录结构相关
44	     if(strpos($key,'..') !== false)
45	     {
46	         $key=str_replace('..','',$key);
47	     }
48	     //这个和魔术常量,魔术方法有关
49	     if(strpos($key,'__') !== false)
50	     {
51	         $key= preg_replace('/__(?:.+?)__/','',$key);
52	     }
53	     //只允许符合数字 字母 下划线 . - 而且只允许数字字母下划线开头
54	     returnpreg_replace('/^([\w\.\-_]+)$/','\\1',$key);
55	 }
56	 functionfilter_value($val)
57	 {
58	     //当表单中存在html字段时 说明我们需要传入的是纯html代码 不需要过滤
59	     if($_REQUEST['html'])
60	     {
61	         return$val;
62	     }
63	     if(is_numeric($val))
64	     {
65	         return$val;
66	     }
67	     elseif(empty($val))
68	     {
69	         returnis_array($val) ?array() :'';
70	     }
71	     //过滤javascript代码
72	     $val= preg_replace("/<script/i","&#60;script",$val);
73	   
74	     $invalid_string=array('&#032;','<!--','-->','>','<','"','!', "'", "\n", '$', "\r");
75	     $valid_string=array(' ','&#60;&#33;--','--&#62;','&gt;','&lt;','&quot;','&#33;','&#39;',"\n",'&#036;','');
76	     $val=str_replace($invalid_string,$valid_string,$val);
77	     //将反转义字符 \&amp;# 或者\?# 替换为html字体实符集
78	     returnpreg_replace('/\\\(&amp;#|\?#)/','&#092;',$val);
79	 }

分别过滤了数组的key和value,对应上面的filter_key和filter_value,总调度函数是initUserInput();主要过滤的POST数据GET数据和COOKIE数据。

相关TAG标签
上一篇:PHP的oAuth服务架构
下一篇:php采用数据库保留session
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站