PHP表单之表单验证

一、表单安全

1、htmlspecialchars()函数

把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 &lt; 和 &gt; 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。

跨站点脚本攻击(Cross Site Scripting):为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。


HTML 实体:HTML 中的预留字符必须被替换为字符实体。如果希望正确地显示预留字符,我们必须在 HTML 源代码中使用字符实体(character entities)。

显示结果 描述 实体名称 实体编号
  空格 &nbsp;  
< 小于号 &lt; <
> 大于号 &gt; >
& 和号 &amp; &
引号 &quot; "
撇号 &apos; (IE不支持) '
&cent; ¢
&pound; £
日圆 &yen; ¥
欧元 &euro;
§ 小节 &sect; §
? 版权 &copy; ©
? 注册商标 &reg; ®
? 商标 &trade;
× 乘号 &times; ×
÷ 除号 &divide; ÷

一个简单的加法器(注意看其中的htmlspecialchars

<html>
<body>

<form method=‘post‘ action=‘<?php echo htmlspecialchars($_SERVER[‘PHP_SELF‘])?>‘>
<input type="text" pattern="[0-9]*" name="left">
+
<input type="text" pattern="[0-9]*" name="right">
=
<input type="submit" value="计算">
</form>

</body>
</html>

<?php
echo $_POST[‘left‘]+$_POST[‘right‘];
?>

2、创建表单验证函数

<html>
<head>
<title>表单测试</title>
</head>
<body>

<?php
$name = $email = $website=$comment="";
function format_input($data){
    $data=trim($data);#去除首尾多余的空白符
    $data=stripcslashes($data);#去除用户输入的反斜杠
    $data=htmlspecialchars($data);#转化为html实体
    return $data;
}
if($_SERVER[‘REQUEST_METHOD‘]=="POST"){
    $name=format_input($_POST[‘name‘]);
    $email=format_input($_POST[‘email‘]);
    $website=format_input($_POST[‘website‘]);
    $comment=format_input($_POST[‘comment‘]);
}
?>

<form method="POST" action="<?php echo htmlspecialchars($_SERVER[‘PHP_SELF‘])?>">
姓名:<input type="text" name="name" />
<br /><br />
电邮:<input type="text" name="email" />
<br /><br />
网址:<input type="text" name="website" />
<br /><br />
评论:<textarea cols="22" rows="5" name="comment"></textarea>
<br /><br />
<input type=‘submit‘ value=‘提交‘ />
</form>
<?php
echo "<br />name:".$name;
echo "<br />email:".$email;
echo "<br />website:".$website;
echo "<br />comment:".$comment;
?>

</body>
</html>

二、表单必填

字段 验证规则
Name 必需。必须包含字母和空格。
E-mail 必需。必须包含有效的电子邮件地址(包含 @ 和 .)。
Website 可选。如果选填,则必须包含有效的 URL。
Comment 可选。多行输入字段(文本框)。

<html>
<head>
<title>表单必填</title>
<style>
.error {color:#FF0000;}
</style>
</head>
<body>

<?php
$name = $email = $website=$comment="";
$nameErr=$emailErr=$websiteErr=$commentErr="";
function format_input($data){
    $data=trim($data);#去除首尾多余的空白符
    $data=stripcslashes($data);#去除用户输入的反斜杠
    $data=htmlspecialchars($data);#转化为html实体
    return $data;
}
if($_SERVER[‘REQUEST_METHOD‘]=="POST"){
    if(empty($_POST[‘name‘]))
        $nameErr="姓名是必填的!";
    else
        $name=format_input($_POST[‘name‘]);
    if(empty($_POST[‘email‘]))
        $emailErr="邮箱是必填的!";
    else
        $email=format_input($_POST[‘email‘]);
    $website=format_input($_POST[‘website‘]);
    $comment=format_input($_POST[‘comment‘]);
}
?>

<form method="POST" action="<?php echo htmlspecialchars($_SERVER[‘PHP_SELF‘])?>">
姓名:<input type="text" name="name" />
<span class="error">*<?php echo $nameErr; ?></span>
<br /><br />
电邮:<input type="text" name="email" />
<span class="error">*<?php echo $emailErr; ?></span>
<br /><br />
网址:<input type="text" name="website" />
<br /><br />
评论:<textarea cols="22" rows="5" name="comment"></textarea>
<br /><br />
<input type=‘submit‘ value=‘提交‘ />
</form>
<?php
echo "<br />name:".$name;
echo "<br />email:".$email;
echo "<br />website:".$website;
echo "<br />comment:".$comment;
?>

</body>
</html>

三、格式匹配

利用正则表达式(Regular Expression)对用户输入的数据进行格式验证。更多有关正则表达式的知识请看正则表达式30分钟入门教程以及正则表达式全部符号解释


int preg_match ( string $pattern , string $subject );

搜索subject与pattern给定的正则表达式的一个匹配。



Regex quick reference

符号 意义
[abc] A single character: a, b or c
[^abc] Any single character but a, b, or c
[a-z] Any single character in the range a-z
[a-zA-Z] Any single character in the range a-z or A-Z
^ Start of line
$ End of line
\A Start of string
\z End of string
. Any single character
\s Any whitespace character
\S Any non-whitespace character
\d Any digit
\D Any non-digit
\w Any word character (letter, number, underscore)
\W Any non-word character
\b Any word boundary character
(…) Capture everything enclosed
(a b)
a? Zero or one of a
a* Zero or more of a
a+ One or more of a
a{3} Exactly 3 of a
a{3,} 3 or more of a
a{3,6} Between 3 and 6 of a

1、匹配姓名

“/^[a-zA-Z ]*$/”

只允许空格和字母,”^”表示开头,”$”表示结尾,[a-zA-Z ]表示a-z或者A-Z或者空格中的一个字符。

$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
  $nameErr = "只允许字母和空格!";
}

2、匹配E-mail

“/([\w-]+\@[\w-]+.[\w-]+)/”

“\w”匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’;

+匹配前面的子表达式一次或多次;

“-“匹配”-“。

3、匹配URL

“/\b(?:(?:https?|ftp):\/\/|www.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i”

四、保留表单中的值

原理:在input标签中嵌入PHP脚本。

如果type=”text”,那么就嵌入value=”<?php echo $valuableName; ?>”

如果type=”radio”,那么就嵌入<?php if (isset($valuableName) && $valuableName==”value1”) echo “checked”;?>

最后写了一个简单的登录表单:

<html>
<head>
<title>一个简易的登录表单</title>
</head>

<body>
<?php
$email = $passwd ="";
$emailErr=$passwdErr="";

if($_SERVER[‘REQUEST_METHOD‘]==‘POST‘){
    if(empty($_POST[‘email‘]))
        $emailErr=‘请输入邮箱!‘;
    else if(preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$_POST[‘email‘]))
        $email=clear_input($_POST[‘email‘]);
    else $emailErr="请输入有效的邮箱!";
    if(empty($_POST[‘passwd‘]))
        $passwdErr=‘请输入密码!‘;
    else
        $passwd=clear_input($_POST[‘passwd‘]);
}
function clear_input($data){
    $data=trim($data);
    $data=stripcslashes($data);
    $data=htmlspecialchars($data);
    return $data;
}
?>

<form method="post" action="<?php echo htmlspecialchars($_SERVER[‘PHP_SELF‘]);?>">
邮箱:<input type="text" name="email" value="<?php echo $email;?>" />
<span class=‘error‘><?php echo $emailErr;?></span>
<br />
密码:<input type="password" name="passwd" value="<?php echo $passwd;?>"/>
<span class=‘error‘><?php echo $passwdErr;?></span>
<br />
<input type="submit" name="submit" value="登录">
</form>
<?php
echo "你输入的<br />";
echo "邮箱:".$email;
echo "<br />";
echo "密码:".$passwd;
?>

</body>
</html>

版权声明:本文为Lshare原创文章,需要转载的请联系我,有问题欢迎评论或私信。

时间: 2024-10-08 09:58:29

PHP表单之表单验证的相关文章

jquery验证表单 提交表单

问题: jquery中使用submit提交按钮时,当return false后,依然会提交表单. 解决: 使用button按钮,而不是submit按钮 <script type="text/javascript" src="scripts/jquery-2.0.2.js"></script> <script type="text/javascript"> function check(){ var npassw

EasyUI中在表单提交之前进行验证

使用EasyUi我们可以在客户端表单提交之前进行验证,过程如下:只需在onSubmit的时候使用return  $("#form1").form('validate')方法即可,EasyUi中form模块中的from('validate')方法会自行对我们指定的表单中required=true等需要验证的的元素进行验证,但有不通过的元素时返回一个false; 1    $("#form1").form({ 2                 url: 'login.

使用文档对象在页面上创建学生信息表。 信息表包括学号、姓名、性别、电子邮件、联系电话、个人主页和联系地址, 信息表内容通过表单输入,提交前先使用正则表达式进行验证,联系地址不能超过20个字符, 每输入一名学生的信息,提交后,表格增加一行,表格不能被选择、复制。

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    </head>    <!--        描述:使用文档对象在页面上创建学生信息表.        信息表包括学号.姓名.性别.电子邮件.联系电话.个人主页和联系地址,        信息表内容通过表单输入,提交前先使用

走进AngularJs 表单及表单验证

年底了越来越懒散,AngularJs的学习落了一段时间,博客最近也没更新.惭愧~前段时间有试了一下用yeoman构建Angular项目,感觉学的差不多了想做个项目练练手,谁知遇到了一系列问题.yeoman是基于node.js的一套工具包,由于我一直在windows下编程,而且node.js对于windows环境的支持也在慢慢加强,所以想尝试在windows下用yeoman跟搭建一个项目.过程远比想象的坎坷多了,各种报错,各种搜资料解决问题,最终还是无法解决一些编译出错,以失败告终,转战Linux

JavaScript基础 submit按钮配合form的onsubmit实现表单的提交与验证

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

JavaScript基础 submit按钮结合onclick事件 实现表单的提交与验证

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

JQuery ajax提交表单及表单验证

JQuery ajax提交表单及表单验证 博客分类: jsp/html/javascript/ajax/development Kit 开源项目 注:经过验证,formValidator只适合一个页面不超过一个表单的情况. 本例实现功能:通过ajax提交表单,并在提交表单前对表单的数据进行验证. 主要通过两个插件实现: 第一个: jQuery Form Plugin http://jquery.malsup.com/form 主要功能是ajax提交表单 第二个:jQuery formValida

js验证阻止表单提交(表单绑定onsubmit事件)

原始方式: <form action="http://www.cnblogs.com/zixueit/" onsubmit="return check()"> <input type="submit" value="提交" /> </form> <script type="text/javascript"> function check(){ if(!conf

单表查询,多表查询

单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_comment