实例讲解PHP表单验证功能


Posted in PHP onFebruary 15, 2019

PHP 表单验证

提示:在处理 PHP 表单时请重视安全性!

这些页面将展示如何安全地处理 PHP 表单。对 HTML 表单数据进行适当的验证对于防范黑客和垃圾邮件很重要!

我们稍后使用的 HTML 表单包含多种输入字段:必需和可选的文本字段、单选按钮以及提交按钮:

实例讲解PHP表单验证功能

上面的表单使用如下验证规则:

字段 验证规则
Name 必需。必须包含字母和空格。
E-mail 必需。必须包含有效的电子邮件地址(包含 @ 和 .)。
Website 可选。如果选填,则必须包含有效的 URL。
Comment 可选。多行输入字段(文本框)。
Gender 必需。必须选择一项。

首先我们看一下这个表单的纯 HTML 代码:

文本字段

name、email 和 website 属于文本输入元素,comment 字段是文本框。HTML 代码是这样的:

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>

单选按钮

gender 字段是单选按钮,HTML 代码是这样的:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

表单元素

表单的 HTML 代码是这样的:

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

当提交此表单时,通过 method="post" 发送表单数据。

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

$_SERVER["PHP_SELF"] 是一种超全局变量,它返回当前执行脚本的文件名。

因此,$_SERVER["PHP_SELF"] 将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。

什么是 htmlspecialchars() 函数?

htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。

关于 PHP 表单安全性的重要提示

$_SERVER["PHP_SELF"] 变量能够被黑客利用!

如果您的页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)。

提示:跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于 Web 应用程序。XSS 能够使攻击者向其他用户浏览的网页中输入客户端脚本。

假设我们的一张名为 "test_form.php" 的页面中有如下表单:

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

现在,如果用户进入的是地址栏中正常的 URL:"http://www.example.com/test_form.php",上面的代码会转换为:

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

到目前,一切正常。

不过,如果用户在地址栏中键入了如下 URL:

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

在这种情况下,上面的代码会转换为:

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

这段代码加入了一段脚本和一个提示命令。并且当此页面加载后,就会执行 JavaScript 代码(用户会看到一个提示框)。这仅仅是一个关于 PHP_SELF 变量如何被利用的简单无害案例。

您应该意识到 <script> 标签内能够添加任何 JavaScript 代码!黑客能够把用户重定向到另一台服务器上的某个文件,该文件中的恶意代码能够更改全局变量或将表单提交到其他地址以保存用户数据,等等。

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

通过使用 htmlspecialchars() 函数能够避免 $_SERVER["PHP_SELF"] 被利用。

表单代码是这样的:

<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.hacked.com')</script>

- 代码不会执行,因为会被保存为转义代码,就像这样:

现在这条代码显示在页面上或 e-mail 中是安全的。

在用户提交该表单时,我们还要做两件事:

  1. (通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
  2. (通过 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;
}
?>

请注意在脚本开头,我们检查表单是否使用 $_SERVER["REQUEST_METHOD"] 进行提交。如果 REQUEST_METHOD 是 POST,那么表单已被提交 - 并且应该对其进行验证。如果未提交,则跳过验证并显示一个空白表单。

不过,在上面的例子中,所有输入字段都是可选的。即使用户未输入任何数据,脚本也能正常工作。

下一步是制作必填输入字段,并创建需要时使用的错误消息。

PHP 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
PHP SQLite类
May 07 PHP
PHP生成UTF8文件的方法
May 15 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
PHP实现下载功能的代码
Sep 29 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php使用pear_smtp发送邮件
Apr 15 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
redirect_uri参数错误的解决方法(必看)
Feb 16 PHP
基于php编程规范(详解)
Aug 17 PHP
PHP使用递归按层级查找数据的方法
Nov 10 PHP
实例讲解PHP表单处理
Feb 15 #PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 #PHP
PHP7 echo和print语句实例用法
Feb 15 #PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 #PHP
PHP Include文件实例讲解
Feb 15 #PHP
PHP XML Expat解析器知识点总结
Feb 15 #PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 #PHP
You might like
PHP5 安装方法
2006/10/09 PHP
新闻分类录入、显示系统
2006/10/09 PHP
php实现的click captcha点击验证码类实例
2014/09/23 PHP
详解php中反射的应用
2016/03/15 PHP
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
走出JavaScript初学困境—js初学
2008/12/29 Javascript
JavaScript中的prototype使用说明
2010/04/13 Javascript
使用Jquery搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
2011/07/10 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
python解析xml文件实例分享
2013/12/04 Python
Python删除windows垃圾文件的方法
2015/07/14 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
如何利用find命令查找文件
2015/02/07 面试题
电气专业推荐信范文
2013/11/18 职场文书
优秀家长事迹材料
2014/05/17 职场文书
世界读书日的活动方案
2014/08/20 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
住房抵押登记委托书
2014/09/27 职场文书
学校百日安全活动总结
2015/05/07 职场文书