实例讲解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扩展图文教程
Dec 12 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
php 中英文语言转换类
Sep 07 PHP
PHP爆绝对路径方法收集整理
Sep 17 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHP格式化显示时间date()函数代码
Oct 03 PHP
PHP实现的多进程控制demo示例
Jul 22 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 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
php上的memcache和memcached两个pecl库
2010/03/29 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
Js中获取frames中的元素示例代码
2013/07/30 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
解决JS内存泄露之js对象和dom对象互相引用问题
2017/06/25 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
AngularJs导出数据到Excel的示例代码
2017/08/11 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
2017/10/24 Javascript
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
关于Vue组件库开发详析
2018/07/01 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
基于Vue实现微前端的示例代码
2020/04/24 Javascript
python调用Moxa PCOMM Lite通过串口Ymodem协议实现发送文件
2014/08/15 Python
Python实现多行注释的另类方法
2014/08/22 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
Django组件content-type使用方法详解
2019/07/19 Python
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
校园之星获奖感言
2014/01/29 职场文书
办公室文员工作职责
2014/01/31 职场文书
运动会演讲稿50字
2014/08/25 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
党员公开承诺书2016
2016/03/24 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers