作者:eric_sun2012 | 来源:互联网 | 2013-07-22 14:08
通常php可以通过以下方式接受用户提交的数据表单POST和地址栏的GET两种途径,无论哪一种路径,我们都不能信任用户输入的数据,都要通过程序进行过滤。下面给出常用的数据过滤
通常php可以通过以下方式接受用户提交的数据表单POST和地址栏的GET两种途径,无论哪一种路径,我们都不能信任用户输入的数据,都要通过程序进行过滤。下面给出常用的数据过滤函数。
01
|
functioninitUserInput()
|
03
|
$_data=array($_GET,$_POST,$_COOKIE);
|
05
|
foreach($_dataAS$input)
|
09
|
foreach($inputas$k=>$v)
|
18
|
$return[$k][$k1] = filter_value($v1);
|
23
|
$return[$k] = filter_value($v);
|
29
|
unset($_GET,$_POST,$_COOKIE);
|
32
|
//过滤超全局变量的键 其实是地址栏的参数名和表单的名称
|
33
|
functionfilter_key($key)
|
44
|
if(strpos($key,'..') !== false)
|
46
|
$key=str_replace('..','',$key);
|
49
|
if(strpos($key,'__') !== false)
|
51
|
$key= preg_replace('/__(?:.+?)__/','',$key);
|
53
|
//只允许符合数字 字母 下划线 . - 而且只允许数字字母下划线开头
|
54
|
returnpreg_replace('/^([\w\.\-_]+)$/','\\1',$key);
|
56
|
functionfilter_value($val)
|
58
|
//当表单中存在html字段时 说明我们需要传入的是纯html代码 不需要过滤
|
69
|
returnis_array($val) ?array() :'';
|
74
|
$invalid_string=array('&#032;','','>','<','"','!', "'", "\n", '$', "\r");
|
75
|
$valid_string=array(' ','<&#33;--','-->','>','<','"','&#33;','&#39;',"\n",'&#036;','');
|
76
|
$val=str_replace($invalid_string,$valid_string,$val);
|
77
|
//将反转义字符 \&# 或者\?# 替换为html字体实符集
|
78
|
returnpreg_replace('/\\\(&#|\?#)/','&#092;',$val);
|
分别过滤了数组的key和value,对应上面的filter_key和filter_value,总调度函数是initUserInput();主要过滤的POST数据GET数据和COOKIE数据。