这一节主要由这些内容:
1、判断用户输入的内容是否合法?(用正则表达式,这个需要掌握);
2、如果用户输入的内容不合法,请显示相应的警告信息,并且停止之后的操作;
这里以防止email inject header为例:
首先看看完成之后的完整的代码:
form.php:
1 <?php 2 $missing = array();//用于存储用户没有填写的信息; 3 $error = array();//用于存储用户填写错误的信息; 4 //具体如何识别没有填写或者填写错误的信息,然后把它们存储到相应的数组中?这是另一节的内容了。 5 if(isset($_POST[‘send‘])){ 6 $to = ‘[email protected]‘; 7 $subject = ‘来自留言本的反馈‘; 8 $expect = array(‘name‘,‘email‘,‘comment‘); 9 $required = array(‘name‘,‘comment‘); 10 require ‘mail_process.php‘; 11 } 12 ?> 13 <html> 14 <head> 15 <meta charset="utf-8"> 16 <title>联系我们</title> 17 <style> 18 input,label,textarea{ 19 display:block; 20 margin:1em; 21 } 22 textarea{ 23 width:400px; 24 height:200px; 25 } 26 .waring{ 27 color:red; 28 font-weight:bold; 29 } 30 </style> 31 </head> 32 33 <body> 34 <h1>留言本</h1><!-- 这里添加一个标题,其实是无关紧要的 --> 35 <?php if($_POST && $suspect){ ?> 36 <p class="waring">你输入信息格式不合法</p> 37 38 <?php 39 }elseif($missing || $error){ 40 ?> 41 <p class="waring">你没有按要求填写表单,请按要求填写</p> 42 <?php 43 } 44 ?> 45 <form method="post" action=‘<?php echo($_SERVER[‘PHP_SELF‘]); ?>‘;> 46 47 <label>姓名: 48 <?php if($missing && in_array(‘name‘, $missing)){ ?> 49 <span class="waring">你没有填写名字!</span> 50 <?php } ?> 51 52 <?php 53 if($error && in_array(‘name‘,$error)){ 54 ?> 55 <span class="waring">您填写的姓名格式不合法!</span> 56 <?php } ?> 57 </label> 58 <input type="text" name="name" id="name" 59 <?php 60 if( $error || $missing ){ 61 echo ‘value="‘. htmlentities($name,ENT_COMPAT,‘utf-8‘) . ‘"‘;//原来只有$name,现在加入了htmlentites函数 62 } 63 ?>></input> 64 65 <label>邮箱地址: 66 <?php 67 if($missing && in_array(‘email‘,$missing)){ 68 ?> 69 <span class="waring">你没有填写邮箱地址!</span> 70 <?php } ?> 71 72 <?php 73 if($error && in_array(‘email‘,$error)){ 74 ?> 75 <span class="waring">您填写的邮箱地址格式不合法!</span> 76 <?php } ?> 77 78 </label> 79 <input type="text" name="email" id="email" 80 81 <?php 82 if( $error || $missing ){ 83 echo ‘value="‘. htmlentities($email,ENT_COMPAT,‘utf-8‘) . ‘"‘; 84 } 85 ?> 86 87 ></input> 88 89 <label>评论: 90 <?php 91 if($missing && in_array(‘comment‘,$missing)){ 92 ?> 93 <span class="waring">你没有填写评论</span> 94 <?php } ?> 95 96 <?php 97 if($error && in_array(‘comment‘,$error)){ 98 ?> 99 <span class="waring">您填写的评论格式不合法!</span> 100 <?php } ?> 101 102 </label> 103 <textarea name="comment" id="comment"><?php //textarea的开始符和PHP的开始符之间不要有空格,要不然会页面中显出出来。 104 if($missing || $error){ 105 echo htmlentities($comment,ENT_COMPAT,‘utf-8‘); 106 } 107 ?></textarea> <!-- 同样的textarea的结束符也是和PHP的结束符之间不要有空格。 --> 108 109 <input type="submit" name="send" id="send" value="提交评论"></submit> 110 </form> 111 112 </body> 113 </html>
mail_process.php:
1 <?php 2 $suspect = false; 3 $pattern = ‘/Content-Type:|Bcc:|Cc:/i‘; 4 5 function isSuspect($val,$pattern,&$suspect) { 6 if(is_array($val)){ 7 foreach($val as $item){ 8 isSuspect($item,$pattern,$suspect); 9 } 10 }else{ 11 if(preg_match($pattern,$val)){ 12 $suspect = true; 13 } 14 } 15 } 16 17 isSuspect($_POST,$pattern,$suspect); 18 19 if(!$suspect){ 20 foreach($_POST as $key => $value){ 21 $temp = is_array($value) ? $value :trim($value); //判定用户的输入是不是一个数组; 22 if(empty($temp) && in_array($key,$required)){ 23 $missing[] = $key;//如果输入是空的,就把它放到$missing的数组里面; 24 $$key = ‘‘;//并且把空值赋给$$key; 25 }elseif(in_array($key,$expect)){ 26 $$key = $temp;//如果不是空的,而且还是我们想要的$expece,那就把它的值赋给$$key,所以说$$key有可能是个数组了。 27 } 28 } 29 }
首先我们从后端逻辑开始,如何完成2、如果用户输入的信息不合法,显示相应的信息并停止之后的操作:
有两段代码:
1 <?php if($_POST && $suspect){ ?> 2 <p class="waring">你输入信息格式不合法</p> 3 4 <?php 5 }elseif($missing || $error){ 6 ?> 7 <p class="waring">你没有按要求填写表单,请按要求填写</p> 8 <?php 9 } 10 ?>
1 if(!$suspect){ 2 foreach($_POST as $key => $value){ 3 $temp = is_array($value) ? $value :trim($value); //判定用户的输入是不是一个数组; 4 if(empty($temp) && in_array($key,$required)){ 5 $missing[] = $key;//如果输入是空的,就把它放到$missing的数组里面; 6 $$key = ‘‘;//并且把空值赋给$$key; 7 }elseif(in_array($key,$expect)){ 8 $$key = $temp;//如果不是空的,而且还是我们想要的$expece,那就把它的值赋给$$key,所以说$$key有可能是个数组了。 9 } 10 } 11 }
好了,这是一个很简单的逻辑,我们使用$suspect这个变量来存储”用户的输入是否可疑“这个信息,如果用户的输入是可以的,则$suspect == true;否则为false.
那我们具体是如何实现用$suspect来holde“用户输入是否可疑”这个信息的呢?这个是前段的逻辑了,我们是通过如下代码来判断的:
1 $suspect = false; 2 $pattern = ‘/Content-Type:|Bcc:|Cc:/i‘; 3 4 function isSuspect($val,$pattern,&$suspect) { 5 if(is_array($val)){ //如果是数组,就遍历整个数组,将数组的每个value都找出来,赋值给$item; 6 foreach($val as $item){ 7 isSuspect($item,$pattern,$suspect); //这就是传说中的递归?? 8 } 9 }else{ 10 if(preg_match($pattern,$val)){ 11 $suspect = true; //如果用户的输入正好匹配这个正则,那就说明他的输入是可以的,否则$suspect的值不变,还是false. //得到$suspect的值,根据上面的两则代码,如果用户的输入可以,我们就可显示错误信息,并且阻止进一步的操作。12 } 13 } 14 }
首先行1,我们假设用户的输入可疑是false,即$suspect = false;
行2,是正则匹配,正则表达式需要理解,但是这里只要知道:如果用户的输入跟这个正则表达式匹配,那就说明它的输入可疑 为 true。
行4是引用,关于引用请参见另一篇博文:http://www.cnblogs.com/huaziking/p/4070981.html
时间: 2024-10-04 00:00:33