用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 = ‘[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>
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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。