首页 > 代码库 > 用PHP Email发送表单内容(7)- 如何防止非法内容的输入?

用PHP Email发送表单内容(7)- 如何防止非法内容的输入?

这一节主要由这些内容:

1、判断用户输入的内容是否合法?(用正则表达式,这个需要掌握);

2、如果用户输入的内容不合法,请显示相应的警告信息,并且停止之后的操作;


这里以防止email inject header为例:

首先看看完成之后的完整的代码:

form.php:

  1 <?php  2 $missing = array();//用于存储用户没有填写的信息;  3 $error = array();//用于存储用户填写错误的信息;  4 //具体如何识别没有填写或者填写错误的信息,然后把它们存储到相应的数组中?这是另一节的内容了。  5 if(isset($_POST[‘send‘])){  6     $to = ‘wangjianhua@example.com‘;  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="http://www.mamicode.com/‘. 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="http://www.mamicode.com/‘. 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="http://www.mamicode.com/提交评论"></submit>110         </form>111         112     </body>113 </html>
View Code

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 }
View Code

 

首先我们从后端逻辑开始,如何完成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

 

用PHP Email发送表单内容(7)- 如何防止非法内容的输入?