实例讲解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 替换模板变量实现步骤
Aug 24 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
May 09 PHP
php流量统计功能的实现代码
Sep 29 PHP
利用PHP扩展vld查看PHP opcode操作步骤
Mar 04 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 PHP
Laravel框架FormRequest中重写错误处理的方法
Feb 18 PHP
php+ajax 文件上传代码实例
Mar 18 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 表单提交给自己
2008/07/24 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
jQuery操作checkbox选择(list/table)
2013/04/07 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
Python 字符串定义
2009/09/25 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
python多线程方式执行多个bat代码
2016/06/07 Python
python类的继承实例详解
2017/03/30 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
考试不及格检讨书
2014/01/09 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
2015年党性分析材料
2014/12/19 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
六年级上册《闻官军收河南河北》的教学设计
2019/11/15 职场文书