实例讲解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 相关文章推荐
php a simple smtp class
Nov 26 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
PHP三元运算的2种写法代码实例
May 12 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 PHP
PHP实现自动登入google play下载app report的方法
Sep 23 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
php查询操作实现投票功能
May 09 PHP
win10环境PHP 7 安装配置【教程】
May 09 PHP
php简单获取复选框值的方法
May 11 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
May 24 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
深入了解js原型模式
2019/05/30 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
C语言面试题
2013/05/19 面试题
ASP.NET中的身份验证有那些
2012/07/13 面试题
节水标语大全
2014/06/11 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
2015年底工作总结范文
2015/05/15 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书