php表单验证
1、表单验证
本章节我们将介绍如何使用PHP验证客户端提交的表单数据。
在处理PHP表单时我们需要考虑安全性。
本章节我们将展示PHP表单数据安全处理,为了防止黑客及垃圾信息我们需要对表单进行数据安全验证。
在本章节介绍的HTML表单中包含以下输入字段: 必须与可选文本字段,单选按钮,及提交按钮:
需求如下:
1、需要一个注册页面的处理系统
字段 | 验证规则 |
---|---|
名字 | 可以输入字符串 |
可以输入字符串 | |
爱好 | 多选(足球、篮球、羽毛球、看书、写字;) |
备注 | 多行输入字段(文本域) |
性别 | 单选(男、女) |
首先实现起来,按照我们所学,可以很轻易的写出基本框架
<head>
<meta charset="utf-8">
</head>
<form action="" method="post">
名字:
<input type="text" name="name" > <br>
邮件:
<input type="text" name="email" ><br>
爱好:
<input type="checkbox" name="aihao[]" value="足球" >足球
<input type="checkbox" name="aihao[]" value="篮球">篮球
<input type="checkbox" name="aihao[]" value="羽毛球">羽毛球
<input type="checkbox" name="aihao[]" value="看书">看书
<input type="checkbox" name="aihao[]" value="写字">写字
<input type="checkbox" name="aihao[]"><br>
备注:
<textarea name="beizhu" ></textarea><br>
性别:
<input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br>
<input type="submit" value="提交">
</form>
value="提交">
</form>
写入后端页面,要求可以接收到数据用户输入的数据
<?php
$name=$_REQUEST['name'];
$email=$_REQUEST['email'];
$aihao=$_REQUEST['aihao'];
$beizhu=$_REQUEST['beizhu'];
$xingbie=$_REQUEST['xingbie'];
echo "名字为:".$name."</br>";
echo "邮箱为:".$email."</br>";
echo "爱好为:";
foreach($aihao as $ah){
echo $ah." ";
};
echo "</br>备注为:".$beizhu."</br>";
echo "性别为:".$xingbie."</br>";
?>
但是其实只是这样简单的写,就已经产生了安全漏洞,这就是安全漏洞的由来
一般的程序员只会考虑用户的需求,不会考虑安全问题
XSS攻击代码:<script>alert(‘xss’);</script>
加固方法:
什么是 htmlspecialchars()方法?
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 &#gt
> (大于) 成为 &#gt
加固后的完整代码:
<head>
<meta charset="utf-8">
</head>
<?php
$name=htmlspecialchars($_REQUEST['name']);
$email=htmlspecialchars($_REQUEST['email']);
$aihao=$_REQUEST['aihao'];
$beizhu=htmlspecialchars($_REQUEST['beizhu']);
$xingbie=htmlspecialchars($_REQUEST['xingbie']);
echo "名字为:".$name."</br>";
echo "邮箱为:".$email."</br>";
echo "爱好为:";
if($aihao!=""){
foreach($aihao as $ah){
echo htmlspecialchars($ah)." ";}
}else{
echo "没有爱好</br>";
}
echo "</br>备注为:".$beizhu."</br>";
echo "性别为:".$xingbie."</br>";
?>
<form action="" method="post">
名字:
<input type="text" name="name" > <br>
邮件:
<input type="text" name="email" ><br>
爱好:
<input type="checkbox" name="aihao[]" value="足球" >足球
<input type="checkbox" name="aihao[]" value="篮球">篮球
<input type="checkbox" name="aihao[]" value="羽毛球">羽毛球
<input type="checkbox" name="aihao[]" value="看书">看书
<input type="checkbox" name="aihao[]" value="写字">写字
<input type="checkbox" name="aihao[]"><br>
备注:
<textarea name="beizhu" ></textarea><br>
性别:
<input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br>
<input type="submit" value="提交">
</form>
2、必填以及验证
名字 | 必须。 +只能包含字母和空格 |
---|---|
必须。 + 必须是一个有效的电子邮件地址(包含’@‘和’.') | |
爱好 | 可选,多选(足球、篮球、羽毛球、看书、写字;) |
备注 | 可选。多行输入字段(文本域) |
性别 | 必须。 必须选择一个 |
如果在前面的章节中,所有输入字段都是可选的。
在以下代码中我们加入了一些新的变量: $nameErr, $emailErr, $genderErr, 和 w e b s i t e E r r . 。这些错误变量将显示在必需字段上。我们还为每个 websiteErr.。这些错误变量将显示在必需字段上。 我们还为每个 websiteErr.。这些错误变量将显示在必需字段上。我们还为每个_POST变量增加了一个if else语句。 这些语句将检查 $_POST 变量是 否为空(使用php的 empty() 函数)。如果为空,将显示对应的错误信息。 如果不为空,数据将传递给test_input() 函数:
除去基本的if判断语句,可以判断是否为空,还有一个函数也可以继续判断
empty()函数,使用用法如下:
<?php
$a="123321";
echo empty($a);
?>
结合if判断
<?php
$a="";
if(empty($a)){
echo "kong";
}else{
echo "bukong";
}
?>
最终完整的代码如下:
<head>
<meta charset="utf-8">
</head>
<?php
$name=htmlspecialchars($_REQUEST['name']);
$email=htmlspecialchars($_REQUEST['email']);
$aihao=$_REQUEST['aihao'];
$beizhu=htmlspecialchars($_REQUEST['beizhu']);
$xingbie=htmlspecialchars($_REQUEST['xingbie']);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if(empty($name)){
$nameErr="名字不能为空";
}elseif(empty($email)){
$emailErr="邮件不能为空";
}
elseif(empty($xingbie)){
$xingbieErr="性别不能为空";
}else{
$name="名字为:".$name."</br>";
$email="邮箱为:".$email."</br>";
$beizhu="</br>备注为:".$beizhu."</br>";
$xingbie="性别为:".$xingbie."</br>";
}}
?>
<form action="" method="post">
名字(*):
<input type="text" name="name" > <br>
<?php echo $nameErr."<br>";?>
邮件(*):<?php echo $emailErr;?>
<input type="text" name="email" ><br>
<?php echo $nemailErr."<br>";?>
爱好:
<input type="checkbox" name="aihao[]" value="足球" >足球
<input type="checkbox" name="aihao[]" value="篮球">篮球
<input type="checkbox" name="aihao[]" value="羽毛球">羽毛球
<input type="checkbox" name="aihao[]" value="看书">看书
<input type="checkbox" name="aihao[]" value="写字">写字
<input type="checkbox" name="aihao[]"><br>
备注:
<textarea name="beizhu" ></textarea><br>
性别(*):<?php echo $xingbieErr;?>
<input type="radio" name="xingbie" value="男">男<input type="radio" name="xingbie" value="女">女<br>
<?php echo $xingbieErr."<br>";?>
<input type="submit" value="提交">
</form>
<?php
echo $name;
echo $email;
if($aihao!=""){
foreach($aihao as $ah){
echo "爱好:".$ah=htmlspecialchars($ah)." ";}
}else{
echo "没有爱好</br>";
}
echo $beizhu;
echo $xingbie;
?>