当前位置 : IT培训网 > PHP开发 > php教程 > PHP教程之PHP表单验证

PHP教程之PHP表单验证

时间:2016-11-25 10:30:57  来源:php培训网  作者:郑州IT培训网  已有:名学员访问该课程
今天,IT培训网小编给大家介绍的是PHP教程之PHP表单验证。本章节我们将介绍如何使用PHP验证客户端提交的表单数据。

  今天,IT培训网小编给大家介绍的是PHP教程之PHP表单验证。本章节我们将介绍如何使用PHP验证客户端提交的表单数据。在处理PHP表单时我们需要考虑安全性。

  本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。

  在本章节介绍的HTML表单中包含以下输入字段: 必须与可选文本字段,单选按钮,及提交按钮:

PHP 表单验证实例

* 必需字段。

名字:  

E-mail:  

网址:  

备注:  

性别: 女 男 

 

您输入的内容是:

  查看代码 :

  <!DOCTYPE HTML>

  <html>

  <head>

  <meta charset="utf-8">

  <title>IT培训网(itpxw.cn)</title>

  <style>

  .error {color: #FF0000;}

  </style>

  </head>

  <body>

  <?php

  // 定义变量并默认设置为空值

  $nameErr = $emailErr = $genderErr = $websiteErr = "";

  $name = $email = $gender = $comment = $website = "";

  if ($_SERVER["REQUEST_METHOD"] == "POST")

  {

  if (empty($_POST["name"]))

  {

  $nameErr = "名字是必需的";

  }

  else

  {

  $name = test_input($_POST["name"]);

  // 检测名字是否只包含字母跟空格

  if (!preg_match("/^[a-zA-Z ]*$/",$name))

  {

  $nameErr = "只允许字母和空格";

  }

  }

  if (empty($_POST["email"]))

  {

  $emailErr = "邮箱是必需的";

  }

  else

  {

  $email = test_input($_POST["email"]);

  // 检测邮箱是否合法

  if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))

  {

  $emailErr = "非法邮箱格式";

  }

  }

  if (empty($_POST["website"]))

  {

  $website = "";

  }

  else

  {

  $website = test_input($_POST["website"]);

  // 检测 URL 地址是否合法

  if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))

  {

  $websiteErr = "非法的 URL 的地址";

  }

  }

  if (empty($_POST["comment"]))

  {

  $comment = "";

  }

  else

  {

  $comment = test_input($_POST["comment"]);

  }

  if (empty($_POST["gender"]))

  {

  $genderErr = "性别是必需的";

  }

  else

  {

  $gender = test_input($_POST["gender"]);

  }

  }

  function test_input($data)

  {

  $data = trim($data);

  $data = stripslashes($data);

  $data = htmlspecialchars($data);

  return $data;

  }

  ?>

  <h2>PHP 表单验证实例</h2>

  <p><span class="error">* 必需字段。</span></p>

  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

  名字: <input type="text" name="name" value="<?php echo $name;?>">

  <span class="error">* <?php echo $nameErr;?></span>

  <br><br>

  E-mail: <input type="text" name="email" value="<?php echo $email;?>">

  <span class="error">* <?php echo $emailErr;?></span>

  <br><br>

  网址: <input type="text" name="website" value="<?php echo $website;?>">

  <span class="error"><?php echo $websiteErr;?></span>

  <br><br>

  备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea>

  <br><br>

  性别:

  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女

  <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男

  <span class="error">* <?php echo $genderErr;?></span>

  <br><br>

  <input type="submit" name="submit" value="Submit">

  </form>

  <?php

  echo "<h2>您输入的内容是:</h2>";

  echo $name;

  echo "<br>";

  echo $email;

  echo "<br>";

  echo $website;

  echo "<br>";

  echo $comment;

  echo "<br>";

  echo $gender;

  ?>

  </body>

  </html>

上述表单验证规则如下:

  字段验证规则

  名字必须。 +只能包含字母和空格

  E-mail必须。 + 必须是一个有效的电子邮件地址(包含'@'和'.')

  网址必须。如果存在,它必须包含一个有效的URL

  备注必须。 多行输入字段(文本域)

  性别必须。 必须选择一个

  首先让我们先看看纯HTML的表单代码:

  文本字段

  "名字", "E-mail", 及"网址"字段为文本输入元素,"备注"字段是 textarea。HTML代码如下所示:

  “名字”: <input type="text" name="name">

  E-mail: <input type="text" name="email">

  网址: <input type="text" name="website">

  备注: <textarea name="comment" rows="5" cols="40"></textarea>

  单选按钮

  "性别"字段是单选按钮,HTML代码如下所示:

  性别:

  <input type="radio" name="gender" value="female">女

  <input type="radio" name="gender" value="male">男

  表单元素

  HTML 表单代码如下所示:

  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

  该表单使用 method="post" 方法来提交数据。

什么是 $_SERVER["PHP_SELF"] 变量?

  $_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。

  所以, $_SERVER["PHP_SELF"] 会发送表单数据到当前页面,而不是跳转到不同的页面。

什么是 htmlspecialchars()方法?

  htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

  预定义的字符是:

  & (和号) 成为 &

  " (双引号) 成为 "

  ' (单引号) 成为 '

  < (小于) 成为 <

  > (大于) 成为 >

  PHP表单中需引起注重的地方?

  $_SERVER["PHP_SELF"] 变量有可能会被黑客使用!

  当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。

XSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

  指定以下表单文件名为 "test_form.php":

  <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

  现在,我们使用URL来指定提交地址 "test_form.php",以上代码修改为如下所示:

  <form method="post" action="test_form.php">

  这样做就很好了。

  但是,考虑到用户会在浏览器地址栏中输入以下地址:

  http://www.runoob.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

  以上的 URL 中,将被解析为如下代码并执行:

  <form method="post" action="test_form.php/"><script>alert('hacked')</script>

  代码中添加了 script 标签,并添加了alert命令。 当页面载入时会执行该Javascript代码(用户会看到弹出框)。 这仅仅只是一个简单的实例来说明PHP_SELF变量会被黑客利用。

  请注意, 任何JavaScript代码可以添加在<script>标签中! 黑客可以利用这点重定向页面到另外一台服务器的页面上,页面 代码文件中可以保护恶意代码,代码可以修改全局变量或者获取用户的表单数据。

  如何避免 $_SERVER["PHP_SELF"] 被利用?

  $_SERVER["PHP_SELF"] 可以通过 htmlspecialchars() 函数来避免被利用。

  form 代码如下所示:

  <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

  htmlspecialchars() 把一些预定义的字符转换为 HTML 实体。现在如果用户想利用 PHP_SELF 变量, 结果将输出如下所示:

  <form method="post" action="test_form.php/"><script>alert('hacked')</script>">

  尝试该漏洞失败!

  使用 PHP 验证表单数据

  首先我们对用户所有提交的数据都通过 PHP 的 htmlspecialchars() 函数处理。

  当我们使用 htmlspecialchars() 函数时,在用户尝试提交以下文本域:

  <script>location.href('http://www.itpxw.cn')</script>

  该代码将不会被执行,因为它会被保存为HTML转义代码,如下所示:

  <script>location.href('http://www.itpxw.cn')</script>

  以上代码是安全的,可以正常在页面显示或者插入邮件中。

  当用户提交表单时,我们将做以下两件事情,:

  使用 PHP trim() 函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。

  使用PHP stripslashes()函数去除用户输入数据中的反斜杠 (\)

  接下来让我们将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。

  将函数命名为 test_input()。

  现在,我们可以通过test_input()函数来检测 $_POST 中的所有变量, 脚本代码如下所示:

  实例

  <?php

  // 定义变量并默认设置为空值

  $name = $email = $gender = $comment = $website = "";

  if ($_SERVER["REQUEST_METHOD"] == "POST")

  {

  $name = test_input($_POST["name"]);

  $email = test_input($_POST["email"]);

  $website = test_input($_POST["website"]);

  $comment = test_input($_POST["comment"]);

  $gender = test_input($_POST["gender"]);

  }

  function test_input($data)

  {

  $data = trim($data);

  $data = stripslashes($data);

  $data = htmlspecialchars($data);

  return $data;

  }

  ?>

  运行实例 :

PHP 表单验证实例

名字:  

E-mail:  

网址:  

备注:  

性别: 女 男 

您输入的内容是:

  注意我们在执行以上脚本时,会通过$_SERVER["REQUEST_METHOD"]来检测表单是否被提交 。如果 REQUEST_METHOD 是 POST, 表单将被提交 - 数据将被验证。如果表单未提交将跳过验证并显示空白。

  在以上实例中使用输入项都是可选的,即使用户不输入任何数据也可以正常显示。

  在接下来的章节中我们将介绍如何对用户输入的数据进行验证。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
------分隔线----------------------------
PHP 教程
1、PHP 基础
1.1 PHP 简介
1.2 PHP 安装
1.3 PHP 语法
1.4 PHP 变量
1.5 PHP echo/print
1.6 PHP 数据类型
1.7 PHP 常量
1.8 PHP 字符串
1.9 PHP 运算符
1.10 PHP If...Else
1.11 PHP Switch
1.12 PHP 数组
1.13 PHP 数组排序
1.14 PHP 超级全局变量
1.15 PHP While 循环
1.16 PHP For 循环
1.17 PHP 函数
1.18 PHP 魔术变量
1.19 PHP 命名空间
1.20 PHP 面向对象
2、PHP 表单
2.1 PHP 表单
2.2 PHP 表单验证
2.3 PHP 表单 - 必需字段
2.4 PHP 表单 - 验证邮件和URL
2.5 PHP 完整表单实例
2.6 PHP $_GET 变量
2.7 PHP $_POST 变量
3、PHP 高级教程
3.1 PHP 多维数组
3.2 PHP 日期
3.3 PHP 包含
3.4 PHP 文件
3.5 PHP 文件上传
3.6 PHP Cookie
3.7 PHP Session
3.8 PHP E-mail
3.9 PHP 安全 E-mail
3.10 PHP Error
3.11 PHP 过滤器
3.12 PHP 高级过滤器
3.13 PHP JSON
4、PHP 7 新特性
4.1 PHP 7 新特性
5、PHP 数据库
5.1 PHP MySQL 简介
5.2 PHP MySQL 连接
5.3 PHP MySQL 创建数据库
5.4 PHP MySQL 创建数据表
5.5 PHP MySQL 插入数据
5.6 PHP MySQL 插入多条数据
5.7 PHP MySQL 预处理语句
5.8 PHP MySQL 读取数据
5.9 PHP MySQL Where
5.10 PHP MySQL Order By
5.11 PHP MySQL Update
5.12 PHP MySQL Delete
5.13 PHP ODBC
6、PHP XML
6.1 XML Expat Parser
6.2 XML DOM
6.3 XML SimpleXML
7、PHP 与 AJAX
7.1 AJAX 简介
7.2 AJAX 与PHP
7.3 AJAX 数据库
7.4 AJAX XML
7.5 AJAX 实时搜索
7.6 AJAX RSS Reader
7.7 AJAX 投票