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","<script",$val);
73
74 $invalid_string=array(' ','<!--','-->','>','<','"','!', "'", "\n", '$', "\r");
75 $valid_string=array(' ','<!--','-->','>','<','"','!',''',"\n",'$','');
76 $val=str_replace($invalid_string,$valid_string,$val);
77 //将反转义字符 \&# 或者\?# 替换为html字体实符集
78 returnpreg_replace('/\\\(&#|\?#)/','\',$val);
79 }
分别过滤了数组的key和value,对应上面的filter_key和filter_value,总调度函数是initUserInput();主要过滤的POST数据GET数据和COOKIE数据。