php表单敏感字符过滤类
这篇文章主要介绍了php表单敏感字符过滤类及其用法实例,详细分析了表单生成与提交等环节针对敏感字符的过滤功能,是非常实用的技巧,需要的朋友可以参考下
本文实例讲述了php表单敏感字符过滤类及其用法。分享给大家供大家参考。具体分析如下:
- /**
- * 表单生成验证文件
- */
- $_form = new formHtmlFind();
- class formHtmlFind{
- /**
- * 输出表单函数
- * $formKey 表单键
- * $infoArray 更新时的原始信息数组
- */
- public function formHtml($array,$infoArray='')
- {
- // 检测数组是否存在
- if(emptyempty($array))return false;
- $newform = null;
- // 信息数组(更新信息)
- $this->infoArray = !emptyempty($infoArray)?$infoArray:array();
- $this->array['class'] = get_class_methods(get_class());
- foreach ($array as $key =>$arr)
- {
- // 键值转换为纯英文
- $key = preg_replace("/[^a-z]/i",'',$key);
- // 生成表单
- $newform .= $this->outputForm($arr,$key);
- }
- // 输出表单
- return $newform.$this->jsError();
- }
- /**
- * 生成表单函数
- */
- private function outputForm($arr,$key)
- {
- $value = null;
- if(emptyempty($arr))return false;
- // input Type
- $type = $key;
- // input NAME
- $name = trim($arr[0]);
- // input 初始值 不包含多选,单选类
- $value = (!emptyempty($this->infoArray[$name]))? trim($this->infoArray[$name]):trim($arr[1]);
- $value = emptyempty($this->post[$name])? $value :trim($this->post[$name]);
- // input Title
- $title = trim($arr[2]);
- // 样式
- $style = trim($arr[3]);
- if($key!=="hidden")
- {
- $dt = "
- {$title}
- ";
- // js错误提示
- $dd = "J{$name}">rn";
- }
- return (!preg_match("/checkbox|select|radio/i",$key))?
- $dt.$this->newInput($type,$name,$value,$style,$title).$dd:
- $this->formSelect($type,$name,$arr[1],$title,$style); // 多选类
- }
- /**
- * 提交数据检测
- */
- public function postForm($array)
- {
- // 检测数组是否存在
- if(emptyempty($array)||emptyempty($_POST))return false;
- $this->post = $_POST;
- $this->array['class'] = get_class_methods(get_class());
- foreach ($array as $key =>$arr)
- {
- // 键值转换为纯英文
- $key = preg_replace("/[^a-z]/i",'',$key);
- // 检测 注销file类表单
- if (!emptyempty($arr)&&'file' != $key)$newData[trim($arr[0])] = $this->postFind($arr,$key);
- }
- // 输出表单
- if(!emptyempty($this->error))
- {
- return false;
- }
- else return $newData;
- }
- /**
- * 生成表单
- */
- private function newInput($type,$name,$value,$style,$title)
- {
- switch ($type)
- {
- case 'text':
- // 单行文本
- return "text" name="{$name}" value="{$value}" {$style}/>";
- break;
- case 'password':
- //密码输入
- return "password" name="{$name}" {$style}/>";
- break;
- case '':
- //多行文本
- return "{$name}" {$style}/>{$value}";
- break;
- case 'hidden':
- // 隐藏
- return "hidden" name="{$name}" value="{$value}" {$style}/>";
- break;
- case 'file':
- // 文件上传
- return "file"name="{$name}" {$style}/>"; type= "
- break;
- case 'submit':
- // 提交
- return "submit" name="{$name}" value="$value" $style}/>";
- break;
- default:
- return "{$type}类型错误!!!";
- break;
- }
- }
- /**
- * 提交信息检测
- * 错误返回error
- */
- private function postFind($arr,$key)
- {
- if(emptyempty($arr))return false;
- $name = $title =$error =$find =$standard =null;
- // input NAME
- $name = trim($arr[0]);
- // input Title
- $title = trim($arr[2]);
- // 错误提示
- $error = trim($arr[4]);
- // 检测类型 Y N
- $find = trim($arr[5]);
- // 检测标准
- $standard = trim($arr[6]);
- //
- if(!emptyempty($standard))$this->error .=$this->ck_split($standard,$name,$title,$find,$error);
- // 转换为字符串
- if(is_array($this->post[$name]))$this->post[$name] = implode(",",$this->post[$name]);
- // 转义或其他转化
- $KKarray = array();
- if(preg_match("/Y|N/is",$find))
- {
- $KKarray = split("_", $find);
- // 转义或过滤
- $escape_filter = (!emptyempty($KKarray[1]))?'ck_'.$KKarray[1]:'';
- // 输出通过检测的合法数据
- $data = ($escape_filter)?$this->$escape_filter($this->post[$name]):$this->post[$name];
- }
- else $data = "";
- // 输出新的数据
- return $data;
- }
- /**
- * 多选类表单生成
- */
- private function formSelect($type,$name,$value,$title,$style)
- {
- $outform = null;
- // 触发更新和提交动作时的初始
- $nowvalue = (!emptyempty($this->post[$name]))?$this->post[$name]:$this->infoarray[$name];
- // 兼容多选的识别,转为数组
- if(!emptyempty($nowvalue))$valueArray = explode(",",$nowvalue);
- // 选项标题
- if(is_array($title))
- {
- array_unshift($title,'选择');
- $titarray = array_values($title);
- }else $titarray = explode("|",$title);
- // 选项值
- if(is_array($value))
- {
- array_unshift($value,'选择');
- $valarray = array_keys($value);
- if(emptyempty($title))$titarray = array_values($value);
- }
- else $valarray = explode("|",$value);
- // 取消表单的初始默认值
- if(!emptyempty($this->post)&&!emptyempty($this->infoArray))$value = preg_replace("/Y_/i",'',$value);
- foreach ($valarray as $key =>$varl)
- {
- // 非默认的识别
- if(!emptyempty($valueArray))$select = (in_array($varl,$valueArray))?'Y':'';
- // 判断是否为默认
- else $select = (eregi("Y_",$varl))? 'Y':'';
- if($key >'0')
- {
- $_title=($titarray[$key])? $titarray[$key]:$title;
- switch ($type)
- {
- case 'select':
- if('Y' == $select)$select = 'selected';
- $outform .= sprintf("%s"/>%srn"
- ,$select,preg_replace("/Y_/i",'',$varl),$_title);
- break;
- case 'radio':
- if('Y' == $select)$select = 'checked';
- $outform .= sprintf("rn",
- $_title,$select,$name,$varl,$style);
- break;
- case 'checkbox':
- if('Y' == $select)$select = 'checked';
- $outform .= sprintf("rn",$_title,$select,$name,$varl,$style);
- break;
- }
- $select =null;
- }
- }
- // 下拉选择
- if($type =='select')$outform = sprintf('%s',$name,$style,$outform);
- return sprintf("
- %s
- %sJ%s">
- rn",$titarray[0],$outform,$name);
- }
- /**
- * 表单验证 及全部 ck_类函数
- */
- private function ck_split($standard,$name,$title,$find,$error)
- {
- // 非必填缺省跳过
- if(eregi('N',$find) && emptyempty($this->post[$name]))return false;
- // 必填缺省检测
- if(eregi('Y',$find) && emptyempty($this->post[$name]))return "["J{$name}","$error"],";
- $t_error = null;
- // 多项检测
- $arr = explode(',',$standard);
- // POST数据检测
- if(!emptyempty($arr))foreach ($arr as $var)
- {
- if(trim($var)!='')
- {
- switch ($this->post)
- {
- case is_array($this->post[$name]):
- // 数组类的检测
- foreach ($this->post[$name] as $_var)
- {
- $t_error.= ($this->ck_open($_var,trim($var)))?"":$error;
- if($t_error)break;
- }
- break;
- default:
- $t_error.= ($this->ck_open($this->post[$name],trim($var)))?"":$error;
- break;
- }
- if($t_error)break;
- }
- }
- return ($t_error)? "["J{$name}","$t_error"],":"";
- }
- // 函数调用
- private function ck_open($string,$str)
- {
- $functi = $this->ck_detected($str);
- return ($this->$functi($string,$str))? true:false;
- }
- // 类型判断
- private function ck_detected($str)
- {
- $detect = (eregi("^[a-zA-Z]*$",$str))? "{$str}Detect":'lengthDetect';
- if(!in_array($detect,$this->array['class']))
- {
- location('index.php',$ck,' Lack of function !!!');
- }
- return $detect;
- }
- //-------------------------------------以下为检测函数可外部调用
- // 长度
- public function lengthDetect($string,$str){
- $len = split('-',trim($str));
- return (strlen($string) > ($len[0]-1) && strlen($string) < ($len[1]+1))? true:false;
- }
- // 价格
- public function moneyDetect($str){
- return preg_match("/^(-|+)?d+(.d+)?$/",$str);
- }
- // 邮件
- public function emailDetect($str){
- return preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $str);
- }
- // 网址
- public function urlDetect($str){
- return preg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/", $str);
- }
- // 数字型
- public function numDetect($str){
- return is_numeric($str);
- }
- // 中文
- public function cnDetect($str){
- return preg_match("/^[x7f-xff]+$/", $str);
- }
- // 字母
- public function enDetect($str){
- return preg_match("/^[A-Za-z]+$/", $str);
- }
- // 数字字母混合
- public function numenDetect($str){
- return preg_match("/^([a-zA-Z0-9_-])+$/",$str);
- }
- // 电话号码
- public function telDetect($str){
- return ereg("^[+]?[0-9]+([xX-][0-9]+)*$", $str);
- }
- // 敏感词
- public function keyDetect($str){
- return (!preg_match("/$badkey/i",$str));
- }
- //-----------------------------------------------------输出
- // 字符替换
- public function ck_filter($str){
- $str=(is_array($str))? implode(",",$str):$str;
- $str=nl2br($str); //将回车替换为
- $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式。
- //$str=str_replace(array(" ",'
- return $str;
- }
- // 转义
- function ck_escape($str)
- {
- if (!get_magic_quotes_gpc())return addslashes($str);
- return $str;
- }
- // MD5加密
- public function ck_md5($str){
- return MD5($str);
- }
- // base64加密
- public function ck_base64($str){
- return base64_encode($str);
- }
- // 时间
- function ck_time($str){
- // time_r() 来在公用函数文件
- if(!is_numeric($str))
- {
- return time_r($str);
- }
- else return $str;
- }
- // 有条件注销(数字)
- public function ck_cancel($str){
- return (!is_numeric($str))? $str:"";
- }
- // 无条件注销
- public function ck_delete(){
- return null;
- }
- // js错误提示
- private function jsError()
- {
- if(emptyempty($this->error))return false;
- return "
- <script language=javascript> rn var error = new Array(".trim($this->error,',').");
- rn for (i=0; i
- rn document.getElementById(error[0]).innerHTML=error[1];
- }rn </script>
- ";
- }
- }
- // 演示:
- $form[1] =array(
- 'text'=>array('title','','产品名称','size=40','产品名称不可缺少!','Y','cn,1-30'),
- 'text1'=>array('categories','','产品名称','','','Y_base64'),
- 'select'=>array('superiors','||1|2|Y_3','产品类别|选择|1|2|3','','必选项','Y'),
- 'radio'=>array('superiors1','|1|Y_2|3','产品xun|产品1|产品2|产品3','','必选项','Y'),
- 'checkbox'=>array('superiors2',array(1=>'11',2=>'22',3=>'33'),'','','必选项','Y'),
- 'file'=>array('ddd','','文件'),
- );
- $form =array (
- 'login' =>
- array (
- 'text' =>
- array (
- 0 => 'user',
- 1 => '',
- 2 => '用户名',
- 3 => 'size=20',
- 4 => '!',
- 5 => 'Y',
- 6 => 'numen,6-12',
- ),
- 'password' =>
- array (
- 0 => 'pass',
- 1 => '',
- 2 => '密 码',
- 3 => 'size=22',
- 4 => '密码格式错误!',
- 5 => 'Y_md5',
- 6 => 'numen,6-12',
- ),
- 'radio' =>
- array (
- 0 => 'time',
- 1 => '|7200|3600|1800',
- 2 => 'cookies有效时间|2小时|1小时|30分钟',
- 3 => '',
- 4 => '',
- 5 => 'N_delete',
- 6 => '',
- ),
- ),
- );
- // 表单提交效验
- $past = $_form->postForm($form['login']);
- $dd = array('title'=>'标题','categories'=>'类别');
- // $dd 为已有的信息(如更新时的信息输出) POST数据位内部处理具有优先权
- if(!emptyempty($past))
- {
- echo "
";
- print_r($past);
- echo"";
- }
- echo ';
- echo $_form->formHtml($form['login'],$dd);
- echo '';
希望本文所述对大家的PHP程序设计有所帮助。这篇文章主要介绍了php表单敏感字符过滤类及其用法实例,详细分析了表单生成与提交等环节针对敏感字符的过滤功能,是非常实用的技巧,需要的朋友可以参考下。