在之前的文章中我们已经了解了PHP的基础,其中就有$_GET
和 $_POST
变量,它们用来检索表单中的信息,其中需要我们注意的知识点就是PHP表单用户输入和表单验证。那接下来我们就来看一下PHP中表单输入与表单验证的相关知识吧。
想要去了解PHP表单和用户输入,首先我们要明白什么是表单。Web表单准确来说算是一个互动平台,主要的功能就是让浏览者和网站有一个互动的平台。表单主要就是在网页中用来发送数据到服务器。
例如,注册信息时使用到的表单,当你填写完信息时需要提交,这时候提交就是将你注册时表单上的内容从客户端浏览器传送到服务器端,再经过PHP程序进行处理后,再将用户所需要的信息传递回到客户端浏览器上,通过获取用户的信息,使得PHP与Web表单实现交互。就是提供了这么一个互动的平台。
接下来我们通过示例来看一下表单,示例如下:
<!DOCTYPE html> <html lang=en> <head> <Meta charset=UTF-8> <title>编程之家</title> </head> <body> <form action=form.PHP method=post> 名字: <input type=text name=fname><br> 年龄: <input type=text name=age><br> <input type=submit value=提交> </form> </body> </html>
其中需要我们注意的是表单属于HTML的知识,更多的相关知识,大家可以点击《HTML教程》进行学习,上述示例的运行结果:
这便是我们所说的表单,那么我们在其中填写的信息也就是表单信息会发送到哪里呢?当我们点击提交的时候,表单中的数据就会以POST的形式,发送到form.PHP这个页面。
<?PHP header(Content-type:text/html;charset=utf-8); //设置编码 echo 欢迎你:.$_POST[fname] .<br/>; echo 你的年龄是:.$_POST['age']; ?>
我们发送到from.PHP的运行结果如下:
当用户输入完成后,这时候就需要对表单进行验证了,应该在任何可能的时候通过客户端脚本对用户输入进行验证。浏览器验证速度更快,并且可以减轻服务器的负载。
如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,把表单传给它自己,而不是跳转到不同的页面。这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。那么接下来我们一起来看一下表单验证的相关知识吧。
PHP表单验证
在处理PHP表单时我们需要考虑安全性。我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。接下来我们通过实例来看一下表单中的必须与可选文本字段,单选按钮,及提交按钮。
示例如下:
<!DOCTYPE HTML> <html> <head> <Meta charset=utf-8> <title>PHP.cn</title> </head> <body> <h2>PHP 表单验证实例</h2> <form method=post action=<?PHP echo htmlspecialchars($_SERVER[PHP_SELF]);?>> 名字: <input type=text name=name value=> <br> E-mail: <input type=text name=email value=> <br> 网址: <input type=text name=website value=> <br> 备注: <textarea name=comment rows=5 cols=40></textarea> <br> 性别: <input type=radio name=gender value=female>女 <input type=radio name=gender value=male>男 <br> <input type=submit name=submit value=提交> </form> </body> </html>
输出结果:
其中我们需要注意的是不同的字段有不同的验证规则,上述示例中不同字段的验证规则如下:
名字的验证规则是必须的,并且只能包含字母和空格。E-mail的验证规则是必须的,其中必须是一个有效的电子邮件地址(包含'@'和'.')。网址的验证规则的是可选的,并且如果存在,它必须包含一个有效的URL。备注的验证规则是可选的,多行输入字段。性别的验证规则是必须的,必须选择一个。
通过上述示例我们再来看一下其中用到的知识:
$_SERVER[PHP_SELF]
变量
$_SERVER[PHP_SELF]
是一种超全局变量,它返回当前执行脚本的文件名。因此,$_SERVER[PHP_SELF]
将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
htmlspecialchars()
函数
htmlspecialchars()
函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
其中我们需要注意的是:
$_SERVER[PHP_SELF]
变量能够被黑客利用,如何避免 $_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()
函数传递所有变量。在用户提交该表单时,我们还要做两件事:
首先通过 PHP trim()
函数去除用户输入数据中不必要的字符,比如多余的空格、制表符、换行等,然后通过 PHP stripslashes()
函数删除用户输入数据中的反斜杠(\
)。接下来我们创建一个检查函数,我们把函数命名为 test_input()
。最后我们能够通过 test_input()
函数检查每个 $_POST
变量。
我们将验证程序可以放到上述示例中去,示例如下:
<!DOCTYPE HTML> <html> <head> <Meta charset=utf-8> <title>编程之家(PHP.cn)</title> </head> <body> <?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; } ?> <h2>PHP 表单验证实例</h2> <form method=post action=<?PHP echo htmlspecialchars($_SERVER[PHP_SELF]);?>> 名字: <input type=text name=name> <br><br> E-mail: <input type=text name=email> <br><br> 网址: <input type=text name=website> <br><br> 备注: <textarea name=comment rows=5 cols=40></textarea> <br><br> 性别: <input type=radio name=gender value=female>女 <input type=radio name=gender value=male>男 <br><br> <input type=submit name=submit value=提交> </form> <?PHP echo <h2>您输入的内容是:</h2>; echo $name; echo <br>; echo $email; echo <br>; echo $website; echo <br>; echo $comment; echo <br>; echo $gender; ?> </body>
输出结果:
其中我们需要注意的是:
我们在执行以上脚本时,会通过$_SERVER[REQUEST_METHOD]
来检测表单是否被提交 。如果 REQUEST_METHOD
是 POST, 表单将被提交 - 数据将被验证。如果表单未提交将跳过验证并显示空白。在以上实例中使用输入项都是可选的,即使用户不输入任何数据也可以正常显示。