用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>

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

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

用PHP Email发送表单内容(10)- 发送邮件

这一节的内容是发送邮件,有以下几点需要注意: 1.mail函数的格式,各个参数的格式: 2.发送成功之后,应该给用户怎样的反馈? 3.如果没有发送成功,改给用户什么样的反馈? 主要是增加了下面这些代码: mail_process.php 1 $mailSended = mail($to ,$subject, $message, $headers, $authenticate);//这里直接换做mail函数 2 if(!$mailSended){ 3 $errors['mailfail'] = t

用PHP Email发送表单内容(3)-根据用户的输入显示错误信息

这一节内容不多,主要由两个地方需要注意: 1.用in_array判定一个变量是否在一个数组中,这是我们判定某一个表单上会否输入或者有错的依据: 2.PHP的条件语句可以可以被<?php ?>标签分隔开来,也就是说首位在不同的标签中,中间部分依然会当做条件语句的一部分,只有判定为true的时候才会显示或者执行. 看一段代码: 1 <?php 2 $missing = array();//用于存储用户没有填写的信息: 3 $error = array();//用于存储用户填写错误的信息: 4

用PHP Email发送表单内容(9)- Buliding the message body

这一节只有一个内容,就是用用户填写的内容自动生产我们的邮件内容,当然还要进行一系列的判定. 邮件主题的内容,是由下面这段代码实现的,看里面的注释就可以理解了: 1 if(!$suspect && !$missing && !$errors){//如果出现以上情况,我们不希望这个程序运行: 2 $message = ''; //先建立$message以后再慢慢的往里面加内容; 3 foreach($expected as $item){ //谨慎起见,我只希望希望的内容出现在

用PHP Email发送表单内容(3)-mail()函数的几个参数详解

这一节主要讲的是mail函数. 首先阅读手册,看看mail函数的基本形式:http://php.net/manual/en/function.mail.php mail();函数接受几个参数: 第一个参数:收件人 $to = ‘[email protected]’; 或者我们有多个收件人: $to = ‘[email protected]’,’[email protected]’; 或者我们还可以加上收件人的名字: $ = ‘david <[email protected]>,james &l

用PHP Email发送表单内容(5)-如何保存用户已经输入的正确信息?

用户输入的信息 ,我们已经通过$$key这个东西将用户的输入存储起来了 ,即我们得到了$name,$email,$comment这些信息.我们现在要做的就是在用户点击submit btn之后将这些信息赋给input的value,或者在textare中显示出来. 为了防止用户输入的某些数值显示出错,需要用到htmlentites函数(点击查看详情). 方法其实很简单,看下面的代码: 1 <input type="text" name="name" id=&quo

用PHP Email发送表单内容(2)-如何去除不必要的反斜线?(magic_quotes_gpc)

这一节的主要内容比较简单,就是去除不必要的反斜线. 其实这是个历史遗留问题,以前PHP为了方便初学者而加入的内容,但是后来发现它造成了更多的问题,而且在现在的语言当中已经被抛弃了 This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0. 扩展阅读:http://php.net/manual/en/security.magicquotes.php(官方手册) 只要知道两种关闭magic_quotes_

判断form表单每个input字段是否有内容

//input失去焦点时判断是否有值 若没有 则不能点击保存 function Input_verification() {//input的内容 var input_val = null; //是否能够点击保存 var canClick = false; this.init = function (fo, btn) { //input列表 fo.input = []; //表单下的input var input_text = fo.find('input[type="text"]');

表单键盘遮挡、修改UIPickerView内容样式

1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndexPath时,记下collectionViewCell距离屏幕底部的间距,再与键盘高度作比较,根据实际情况调整collectionView的contentOffset,但是当输入项较多时这个方法就不行了,需要计算更多collectionViewCell距离屏幕底部的间距,容易出错. (1)选择输入项时

KindEditor:Ajax提交表单时获取不到HTML内容

当用Ajax提交表单时,KindEditor的内容获取不到,HTML数据获取不了 原因:当ajax提交时,KindEdito的HTML数据还没有同步到表单中来,那怎么去获取HTML数据呢? --------------------------------------------------- KindEditor 4.x documentation:获取HTML数据 // 取得HTML内容html = editor.html(); // 同步数据后可以直接取得textarea的valueedit