php表单敏感字符过滤类
本文实例讲述了php表单敏感字符过滤类及其用法。分享给大家供大家参考。具体分析如下:
/** *表单生成验证文件 */ $_form=newformHtmlFind(); classformHtmlFind{ /** *输出表单函数 *$formKey 表单键 *$infoArray更新时的原始信息数组 */ publicfunctionformHtml($array,$infoArray='') { //检测数组是否存在 if(emptyempty($array))returnfalse; $newform=null; //信息数组(更新信息) $this->infoArray=!emptyempty($infoArray)?$infoArray:array(); $this->array['class']= get_class_methods(get_class()); foreach($arrayas$key=>$arr) { //键值转换为纯英文 $key=preg_replace("/[^a-z]/i",'',$key); //生成表单 $newform.=$this->outputForm($arr,$key); } //输出表单 return$newform.$this->jsError(); } /** *生成表单函数 */ privatefunctionoutputForm($arr,$key) { $value=null; if(emptyempty($arr))returnfalse; //inputType $type =$key; //inputNAME $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]); //inputTitle $title =trim($arr[2]); //样式 $style =trim($arr[3]); if($key!=="hidden") { $dt="<dt>{$title}</dt><dd>"; //js错误提示 $dd="<ttid="J{$name}"></tt></dd>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);//多选类 } /** *提交数据检测 */ publicfunctionpostForm($array) { //检测数组是否存在 if(emptyempty($array)||emptyempty($_POST))returnfalse; $this->post = $_POST; $this->array['class']= get_class_methods(get_class()); foreach($arrayas$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)) { returnfalse; } elsereturn$newData; } /** *生成表单 */ privatefunctionnewInput($type,$name,$value,$style,$title) { switch($type) { case'text': //单行文本 return "<inputtype="text"name="{$name}"value="{$value}"{$style}/>"; break; case'password': //密码输入 return"<inputtype="password"name="{$name}"{$style}/>"; break; case'': //多行文本 return"<textareaname="{$name}"{$style}/>{$value}</textarea>"; break; case'hidden': //隐藏 return"<inputtype="hidden"name="{$name}"value="{$value}"{$style}/>"; break; case'file': //文件上传 return"<inputtype="file"name="{$name}"{$style}/>"; break; case'submit': //提交 return"<inputtype="submit"name="{$name}"value="$value"$style}/>"; break; default: return"{$type}类型错误!!!"; break; } } /** *提交信息检测 *错误返回error */ privatefunctionpostFind($arr,$key) { if(emptyempty($arr))returnfalse; $name=$title=$error=$find=$standard=null; //inputNAME $name =trim($arr[0]); //inputTitle $title =trim($arr[2]); //错误提示 $error =trim($arr[4]); //检测类型YN $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; } /** *多选类表单生成 */ privatefunctionformSelect($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($valarrayas$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("<option%svalue="%s"/>%s</option>rn" ,$select,preg_replace("/Y_/i",'',$varl),$_title); break; case'radio': if('Y'==$select)$select='checked'; $outform.=sprintf("<label>%s<input%stype="radio"name="%s"value="%s"%s/></label>rn", $_title,$select,$name,$varl,$style); break; case'checkbox': if('Y'==$select)$select='checked'; $outform.=sprintf("<label>%s<input%stype="checkbox"name="%s[]"value="%s"%s/></label>rn",$_title,$select,$name,$varl,$style); break; } $select=null; } } //下拉选择 if($type=='select')$outform=sprintf('<selectname="%s"%s>%s</select>',$name,$style,$outform); returnsprintf("<dt>%s</dt><dd>%s<ttid="J%s"></tt></dd>rn",$titarray[0],$outform,$name); } /** *表单验证及全部ck_类函数 */ privatefunctionck_split($standard,$name,$title,$find,$error) { // 非必填缺省跳过 if(eregi('N',$find)&&emptyempty($this->post[$name]))returnfalse; //必填缺省检测 if(eregi('Y',$find)&&emptyempty($this->post[$name]))return"["J{$name}","$error"],"; $t_error=null; //多项检测 $arr=explode(',',$standard); //POST数据检测 if(!emptyempty($arr))foreach($arras$var) { if(trim($var)!='') { switch($this->post) { caseis_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"],":""; } //函数调用 privatefunctionck_open($string,$str) { $functi=$this->ck_detected($str); return($this->$functi($string,$str))?true:false; } //类型判断 privatefunctionck_detected($str) { $detect=(eregi("^[a-zA-Z]*$",$str))?"{$str}Detect":'lengthDetect'; if(!in_array($detect,$this->array['class'])) { location('index.php',$ck,'Lackoffunction!!!'); } return$detect; } //-------------------------------------以下为检测函数可外部调用 //长度 publicfunctionlengthDetect($string,$str){ $len=split('-',trim($str)); return(strlen($string)>($len[0]-1)&&strlen($string)<($len[1]+1))?true:false; } //价格 publicfunctionmoneyDetect($str){ returnpreg_match("/^(-|+)?d+(.d+)?$/",$str); } //邮件 publicfunctionemailDetect($str){ returnpreg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/",$str); } //网址 publicfunctionurlDetect($str){ returnpreg_match("/^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>"])*$/",$str); } //数字型 publicfunctionnumDetect($str){ returnis_numeric($str); } //中文 publicfunctioncnDetect($str){ returnpreg_match("/^[x7f-xff]+$/",$str); } //字母 publicfunctionenDetect($str){ returnpreg_match("/^[A-Za-z]+$/",$str); } //数字字母混合 publicfunctionnumenDetect($str){ returnpreg_match("/^([a-zA-Z0-9_-])+$/",$str); } //电话号码 publicfunctiontelDetect($str){ returnereg("^[+]?[0-9]+([xX-][0-9]+)*$",$str); } //敏感词 publicfunctionkeyDetect($str){ return(!preg_match("/$badkey/i",$str)); } //-----------------------------------------------------输出 //字符替换 publicfunctionck_filter($str){ $str=(is_array($str))?implode(",",$str):$str; $str=nl2br($str);//将回车替换为<br> $str=htmlspecialchars($str);//将特殊字元转成HTML格式。 //$str=str_replace(array("",'<?'),array("",'<?'),$str);//替换空格替换为 return$str; } //转义 functionck_escape($str) { if(!get_magic_quotes_gpc())returnaddslashes($str); return$str; } //MD5加密 publicfunctionck_md5($str){ return MD5($str); } //base64加密 publicfunctionck_base64($str){ return base64_encode($str); } //时间 functionck_time($str){ //time_r()来在公用函数文件 if(!is_numeric($str)) { returntime_r($str); } elsereturn$str; } //有条件注销(数字) publicfunctionck_cancel($str){ return(!is_numeric($str))?$str:""; } //无条件注销 publicfunctionck_delete(){ returnnull; } //js错误提示 privatefunctionjsError() { if(emptyempty($this->error))returnfalse; return " <script language=javascript>rnvarerror=newArray(".trim($this->error,',')."); rnfor(i=0;i<error.length;i++){ rndocument.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"<pre>"; print_r($past); echo"</pre>"; } echo'<formmethod="POST"NAME="PostTopic"action=""enctype="multipart/form-data"style="margin:0px;">'; echo$_form->formHtml($form['login'],$dd); echo'<inputtype="submit"value="Y"name="B1"></form>';
希望本文所述对大家的PHP程序设计有所帮助。