PHP表单验证
这里将介绍如何使用PHP验证客户端提交的表单数据。
在处理PHP表单时需要考虑安全性,这里将展示PHP表单数据安全处理,为防止黑客以及垃圾信息就需要对表单进行数据安全验证,实例介绍的HTML表单中包含以下输入字段:必须与可选文本字段,单选按钮,及提交按钮:
form_verify.php:
<html>
<head>
<meta charset="utf-8">
<title>form verify</title>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
//定义变量并默认设置为空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
if (empty($_POST["name"]))
{
$nameErr = "必须添加名字";
}
else
{
$name = test_input($_POST["name"]);
//检测名字是否只包含字母跟空格
if (!preg_match("/^[a-zA-Z]*$/",$name))
{
$nameErr = "只允许字母和空格";
}
}
if (empty($_POST["email"]))
{
$nameErr = "必须添加邮箱";
}
else
{
$email = test_input($_POST["email"]);
//检测邮箱是否合法,必须是一个有效的电子邮件地址,包含'@'和'.'
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$emailErr = "非法邮箱格式";
}
}
if (empty($_POST["website"]))
{
$website = "";
}
else
{
$website = test_input($_POST["website"]);
//检测URL是否合法
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website))
{
$websiteErr = "非法URL地址";
}
}
if (empty($_POST["comment"]))
{
$comment = "必须输入文本";
}
else
{
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"]))
{
$genderErr = "必须填写性别";
}
else
{
$gender = test_input($_POST["gender"]);
}
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP 表单验证实例</h2>
<p><span class="error">* 必需字段。</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
名字: <input type="text" name="name" value="<?php echo $name; ?>"> //text文本输入元素
<span class="error">* <?php echo $nameErr; ?></span>
<br><br>
E-mail:<input type="text" name="email" value="<?php echo $email; ?>"> //text文本输入元素
<span class="error">* <?php echo $emailErr; ?></span>
<br><br>
网址:<input type="text" name="website" value="<?php echo $website; ?>">//text文本输入元素
<span class="error">* <?php echo $websiteErr; ?></span>
<br><br>
备注:<textarea name="comment" rows="5" cols="40"><?php echo $comment; ?></textarea>
<br><br>
性别:
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 //单选按钮
<input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 //单选按钮
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>您输入的内容是:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>
如下:
输入错误格式时:
其中$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与document root相关。
所以,$_SERVER["PHP_SELF"]会发送表单数据到当前页面,而不是跳转到不同的页面。
htmlspecialchars()函数会把一些预定义的字符转换为HTML实体,预定义字符是:
与&成为&
双引号"成为"
单引号'成为'
小于<成为<
大于>成为>
PHP表单中需要注意的地方是:
$_SERVER["PHP_SELF"]变量可能会被黑客使用,当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本,原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。
XSS又叫CSS(Cross-Site Script),跨站脚本攻击,恶意攻击者网Web页面里插入恶意html代码,当用户浏览该页时,嵌入其中Web里面的html代码会被执行,从而达到攻击用户的特殊目的。
指定以下表单文件名为test_form.php:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,使用URL来指定提交地址为test_form.php,可修改如下:
<form method="post" action="test_form.php">
这样做就OK了。
但是,考虑到用户会在浏览器地址栏中输入以下地址:
http://127.0.0.1/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
以上的URL中,将被解析为如下代码行并执行:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
代码中添加了script标签,并添加了alert命令,当页面载入时会执行该Javascript代码,用户能看到弹出框,这仅仅只是一个简单的实例来说明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>">
在执行以上脚本时会通过$_SERVER["REQUEST_METHOD"]来检测表单是否被提交,若REQUEST_METHOD时POST,表单将被提交-数据将会验证,若表单未提交则将跳过验证并显示空白。
之后为每个$_POST变量增加一个if else语句,以检查$_POST变量是否为空,使用php的empty()函数,若为空则显示对应错误信息(也就是用户未填写信息就提交表单则会输出错误信息),否则,将数据传递给test_input()函数处理。
preg_match()进行正则表达式匹配,其原型如下:
int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )
表示在subject字符串中搜索与pattern给出的正则表达式相匹配的内容,若提供了matches,则其会被搜索的结果所填充,$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推。
使用PHP验证表单数据
首先对用户所提交数据都通过PHP的htmlspecialchars()函数处理,当使用htmlspecialchars()函数时,在用户端尝试提交以下文本域:
<script>location.href('http://www.php.cn')</script>
该代码不会被执行,会被保存为HTML转移代码,如下:
<script>location.href('http://www.php.cn')</script>
以上代码是安全的,可正常在页面显示或插入邮件中。
当用户提交表单时,将做以下两件事:
1.使用PHP trim()函数去调用户输入数据中不必要的字符,比如空格 tab 换行符。
2.使用PHP stripslashes()函数去掉用户输入数据中的反斜杠\
参考网址
下一篇: 贵霜帝国:古代欧亚四大强国之一