欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP表单验证

程序员文章站 2022-05-10 19:03:35
...

这里将介绍如何使用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>

如下:

PHP表单验证

PHP表单验证

输入错误格式时:

PHP表单验证

其中$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与document root相关。

所以,$_SERVER["PHP_SELF"]会发送表单数据到当前页面,而不是跳转到不同的页面。

htmlspecialchars()函数会把一些预定义的字符转换为HTML实体,预定义字符是:

与&成为&amp

双引号"成为&quot

单引号'成为&#039

小于<成为&lt

大于>成为&gt

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()函数去掉用户输入数据中的反斜杠\


参考网址

相关标签: PHP表单验证