PHP编程:php表单敏感字符过滤类
发布时间:2020-12-13 02:15:13 所属栏目:PHP教程 来源:网络整理
导读:《php表单敏感字符过滤类》要点: 本文介绍了php表单敏感字符过滤类,希望对您有用。如果有疑问,可以联系我们。 PHP实战 本篇章节讲解php表单敏感字符过滤类及其用法.供大家参考研究.具体分析如下: 代码如下: /** * 表单生成验证文件 */ $_form =
《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 = "<dt>{$title}</dt><dd>"; ??????????????????????? // js错误提示 ??????????????????????? $dd = "<tt id="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,$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,$title) ??????? { ??????????????? switch ($type) ??????????????? { ??????????????????????? case 'text': ??????????????????????????????? // 单行文本 ??????????????????????????????? return? "<input type="text" name="{$name}" value="{$value}" {$style}/>"; ??????????????????????????????? break; ??????????????????????? case 'password': ??????????????????????????????? //密码输入 ??????????????????????????????? return "<input type="password" name="{$name}" {$style}/>"; ??????????????????????????????? break; ??????????????????????? case '': ??????????????????????????????? //多行文本 ??????????????????????????????? return "<textarea name="{$name}" {$style}/>{$value}</textarea>"; ??????????????????????????????? break; ??????????????????????? case 'hidden': ??????????????????????????????? // 暗藏 ??????????????????????????????? return "<input type="hidden" name="{$name}" value="{$value}" {$style}/>"; ??????????????????????????????? break; ??????????????????????? case 'file': ??????????????????????????????? // 文件上传 ??????????????????????????????? return "<input type= "file"name="{$name}" {$style}/>"; ??????????????????????????????? break; ??????????????????????? case 'submit': ??????????????????????????????? // 提交 ??????????????????????????????? return "<input type="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,$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,$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("<option %s value="%s"/>%s</option>rn" ???????????????????????????????????????????????,$select,preg_replace("/Y_/i",$varl),$_title); ??????????????????????????????????????????????? break; ??????????????????????????????????????? case 'radio': ??????????????????????????????????????????????? if('Y' == $select)$select = 'checked'; ??????????????????????????????????????????????? $outform .= sprintf("<label>%s<input %s type="radio" name="%s" value="%s" %s/></label>rn", ??????????????????????????????????????????????? $_title,$varl,$style); ??????????????????????????????????????????????? break; ??????????????????????????????????????? case 'checkbox': ??????????????????????????????????????????????? if('Y' == $select)$select = 'checked'; ??????????????????????????????????????????????? $outform .= sprintf("<label>%s<input %s type="checkbox" name="%s[]" value="%s" %s/></label>rn",$_title,$style); ??????????????????????????????????????????????? break; ??????????????????????????????? } ??????????????????????????????? $select =null; ??????????????????????? } ??????????????? } ??????????????? // 下拉选择 ??????????????? if($type =='select')$outform = sprintf('<select name="%s" %s>%s</select>',$outform); ??????????????? return sprintf("<dt>%s</dt><dd>%s<tt id="J%s"></tt></dd>rn",$titarray[0],$outform,$name); ??????? } ??????? /** ???????? * 表单验证 及全部 ck_类函数 ???????? */ ??????? private function ck_split($standard,$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); //将回车替换为<br> ??????????????? $str=htmlspecialchars($str); //将特殊字元转成 HTML 格式. ??????????????? //$str=str_replace(array(" ",'<? '),array(" ",'< ?'),$str); //替换空格替换为 ??????????????? 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 < error.length; 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', 'checkbox'=>array('superiors2',array(1=>'11',2=>'22',3=>'33'), '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', ????? 2 => '密 码', ????? 3 => 'size=22', ????? 4 => '密码格式错误!', ????? 5 => 'Y_md5', ??? '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 '<form method="POST" NAME="PostTopic" action="" enctype="multipart/form-data" style="margin:0px;">'; echo $_form->formHtml($form['login'],$dd); echo '<input type="submit" value="Y" name="B1"></form>'; PHP实战希望本文所述对大家的PHP程序设计有所帮助. 编程之家培训学院每天发布《php表单敏感字符过滤类》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |