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实体,预定义字符是:

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


参考网址

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值