使用 PHP 过滤器(Filter)进行严格表单验证

PHP 过滤器(Filter)用于验证和过滤来自非安全来源的数据,比如用户的输入,使用过滤器扩展可以使数据过滤更轻松快捷。要求的 PHP 版本是 PHP 5 >= 5.2.0,PHP 7

和 Filter 有关的函数包括

filter_has_var— 检测接收指定类型的变量是否存在,例如通过post传递的username变量是否存在
filter_id — 返回与某个特定名称的过滤器相关联的id
filter_input_array — 获取一系列外部变量,并且可以通过过滤器处理它们
filter_input — 通过名称获取特定的外部变量,并且可以通过过滤器处理它
filter_list — 返回所支持的过滤器列表
filter_var_array — 获取多个变量并且过滤它们
filter_var — 使用特定的过滤器过滤一个变量

其中

filter_input(int $type, string $variable_name [, int $filter = FILTER_DEFAULT] [, mixed $options])

参数 $type 可以是 INPUT_GET,INPUT_POST,INPUT_COOKIE,INPUT_SERVER 或 INPUT_ENV

参数 $filter 的类型可以参见 php 手册:http://php.net/manual/zh/filter.filters.php

使用 Filter 可以对表单必填域验证、数字验证、email 验证、下拉菜单验证、单选按钮验证、复选框验证等。

使用 Filter 可以节省很多正则,例如验证 email、INT、bool ,并且 filter_has_var 函数比 isset 函数要更快。

一、验证必填域

//检查$_POST[‘username‘]长度之前首先确保它存在
if(! (filter_has_var(INPUT_POST, ‘username‘) && (strlen(filter_input(INPUT_POST, ‘username‘)) > 0) )) {
    echo ‘请输入用户名‘;
    exit;
}

说明:filter_has_var 函数在接收到了变量时对变量的值进行验证,在该例中,如果接受到了 $_POST[‘username‘] ,即对 $_POST[‘username‘] 的值进行验证,如果没有接收到变量 $_POST[‘username‘],例如该字段在表单中是单个的复选框,不勾选的话,处理的页面是接收不到该字段的信息的。

二、验证长度

//FILTER_SANITIZE_STRING过滤器会去除HTML标记、删除二进制非ASCII字符、并对与字符编码(&)
if(filter_has_var(INPUT_POST, ‘country‘) && strlen(filter_input(INPUT_POST, ‘country‘, FILTER_SANITIZE_STRING)) <=2) {
    echo ‘country长度不小于2个字符‘;
    exit;
}

说明:

参数 FILTER_SANITIZE_STRING 用于去除 HTML 标记、删除二进制非 ASCII 字符、并且对与字符编码(&)

三、验证邮箱

//验证邮箱
$email = filter_input(INPUT_POST, ‘email‘, FILTER_VALIDATE_EMAIL);
if($email === false) {
    echo ‘请输入正确的邮箱‘;
    exit;
}

说明:使用参数 FILTER_VALIDATE_EMAIL 验证 email

四、验证整数

//验证整数,如果填写了年龄则进行验证
if(strlen(filter_input(INPUT_POST, ‘age‘)) > 0) {
    $age = filter_input(INPUT_POST, ‘age‘, FILTER_VALIDATE_INT);
    if($age === false) {
        echo ‘请输入正确的年龄‘;
        exit;
    }
}

说明:使用参数FILTER_VALIDATE_INT  验证整数

五、验证小数

//验证小数,如果填写了salary则进行验证
if(strlen(filter_input(INPUT_POST, ‘salary‘)) > 0) {
    $salary = filter_input(INPUT_POST, ‘salary‘, FILTER_VALIDATE_FLOAT);
    if($salary === false) {
        echo ‘请输入正确的薪资‘;
        exit;
    }
}

说明:使用参数 FILTER_VALIDATE_FLOAT 验证浮点数

六、验证数组,复选框验证组

//确保$_POST[‘sports‘]存在且是一个数组
if(! (filter_has_var(INPUT_POST, ‘sports‘) && filter_input(INPUT_POST, ‘sports‘, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY))) {
    echo ‘请选择一项运动‘;
    exit;
}

//验证复选框组
//array_intersect 计算数组的交集
if(array_intersect($_POST[‘sports‘], array_values($sports)) != $_POST[‘sports‘]) {
    echo ‘请选择正确的运动‘;
    exit;
}

说明:使用参数 FILTER_DEFAULT 进行占位,使用参数 FILTER_REQUIRE_ARRAY 验证是否是数组

使用 array_intersect 函数计算数组的交集

七、验证单个复选框

//验证单个复选框
if(filter_has_var(INPUT_POST, ‘single‘)) {
    if($_POST[‘single‘] == $value) {
        $single = true;
    } else {
        $single = false;
        echo ‘错误的提交‘;
        exit;
    }
}

八、验证下拉菜单

//验证下拉菜单
if(! (filter_has_var(INPUT_POST, ‘food‘) && array_key_exists($_POST[‘food‘], $choices))) {
    echo ‘请选择喜欢的食物‘;
    exit;
}

九、验证单选按钮

//验证性别
if(! (filter_has_var(INPUT_POST, ‘sex‘) && in_array($_POST[‘sex‘], $sex))) {
    echo ‘请选择性别‘;
    exit;
}

十、验证时间

//验证时间
if(filter_has_var(INPUT_POST, ‘time‘)) {
    foreach($_POST[‘time‘] as $time) {
        @list($year, $month, $day) = explode(‘-‘, $time);
        if(! @checkdate($month, $day, $year)) {
            echo ‘时间错误‘;
            exit;
        }
        //时间段验证(略)
    }
}

说明:使用 checkdate 函数验证是否是正确的时间

完整代码:

<?php

    header(‘Content-type:text/html;charset=utf-8‘);

    //下拉菜单 value=>choice
    $choices = [‘Eggs‘=>‘Eggs Benedict‘, ‘toast‘=>‘Buttered Toast with jam‘, ‘coffee‘=>‘piping hot coffee‘];
    //单选按钮 choice=>value
    $sex = [‘male‘=>1, ‘femail‘=>2];
    $defaults[‘sex‘] = ‘male‘;
    //单个复选框
    $value = ‘yes‘;
    //复选框组 choice=>value
    $sports = [‘足球‘=>‘football‘, ‘跑步‘=>‘run‘, ‘壁球‘=>‘wall_ball‘];

    if($_SERVER[‘REQUEST_METHOD‘] == ‘GET‘) {
?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <script language="javascript" type="text/javascript" src="My97DatePicker/WdatePicker.js"></script>
    </head>
    <body>
        <form action="<?php echo htmlentities($_SERVER[‘SCRIPT_NAME‘]);?>" method="post">
            <table>
                <tr>
                    <td>name:</td>
                    <td><input type="text" name="username"></td>
                </tr>
                <tr>
                    <td>country:</td>
                    <td><input type="text" name="country"></td>
                </tr>
                <tr>
                    <td>email:</td>
                    <td><input type="text" name="email"></td>
                </tr>
                <tr>
                    <td>age:</td>
                    <td>
                        <input type="text" name="age">
                    </td>
                </tr>
                <tr>
                    <td>salary:</td>
                    <td>
                        <input type="text" name="salary">
                    </td>
                </tr>
                <tr>
                    <td>food:</td>
                    <td>
                        <?php echo "<select name=‘food‘>\n";
                            echo "<option value=‘0‘>请选择喜欢的食物:</option>\n";
                            foreach($choices as $key=>$choice) {
                                echo "<option value=‘".$key."‘>".$choice."</option>\n";
                            }
                            echo "</select>";
                        ?>
                    </td>
                </tr>
                <tr>
                    <td>sex:</td>
                    <td>
                        <?php
                            foreach($sex as $key=>$choice) {
                                echo "<input type=‘radio‘ name=‘sex‘ value=‘".$choice."‘";
                                if($defaults[‘sex‘] == $key) {
                                    echo "checked=‘checked‘";
                                }
                                echo ">".$key."\n";
                            }
                        ?>
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <?php
                        foreach($sports as $key=>$choice) {
                            echo "<input type=‘checkbox‘ name=‘sports[]‘ value=‘".$choice."‘>".$key."\n";
                        }
                        ?>
                    </td>
                </tr>
                <tr>
                    <td>
                        是否单身:
                    </td>
                    <td>
                        <?php
                            echo "<input type=‘checkbox‘ name=‘single‘ value=‘yes‘>";
                        ?>
                    </td>
                </tr>
                <tr>
                    <td>
                        工作起始时间:
                    </td>
                    <td>
                        <input class="Wdate" type="text" name="time[]" onClick="WdatePicker()">
                        至
                        <input class="Wdate" type="text" name="time[]" onClick="WdatePicker()">
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <input type="submit" value="提交">
                    </td>
                </tr>
            </table>
        </form>
    </body>
    </html>
<?php
    } else {
        //严格表单认证
        //检查$_POST[‘username‘]长度之前首先确保它存在
        if(! (filter_has_var(INPUT_POST, ‘username‘) && (strlen(filter_input(INPUT_POST, ‘username‘)) > 0) )) {
            echo ‘请输入用户名‘;
            exit;
        }

        //$_POST[‘country‘]是可选的,不过如果提供了country字段,则保证在处理后要多于5个字符
        //FILTER_SANITIZE_STRING过滤器会去除HTML标记、删除二进制非ASCII字符、并对与字符编码(&)
        if(filter_has_var(INPUT_POST, ‘country‘) && strlen(filter_input(INPUT_POST, ‘country‘, FILTER_SANITIZE_STRING)) <=2) {
            echo ‘country长度不小于2个字符‘;
            exit;
        }

        //验证邮箱
        $email = filter_input(INPUT_POST, ‘email‘, FILTER_VALIDATE_EMAIL);
        if($email === false) {
            echo ‘请输入正确的邮箱‘;
            exit;
        }

        //确保$_POST[‘sports‘]存在且是一个数组
        if(! (filter_has_var(INPUT_POST, ‘sports‘) && filter_input(INPUT_POST, ‘sports‘, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY))) {
            echo ‘请选择一项运动‘;
            exit;
        }

        //验证复选框组
        //array_intersect 计算数组的交集
        if(array_intersect($_POST[‘sports‘], array_values($sports)) != $_POST[‘sports‘]) {
            echo ‘请选择正确的运动‘;
            exit;
        }

        //验证单个复选框
        if(filter_has_var(INPUT_POST, ‘single‘)) {
            if($_POST[‘single‘] == $value) {
                $single = true;
            } else {
                $single = false;
                echo ‘错误的提交‘;
                exit;
            }
        }

        //验证整数,如果填写了年龄则进行验证
        if(strlen(filter_input(INPUT_POST, ‘age‘)) > 0) {
            $age = filter_input(INPUT_POST, ‘age‘, FILTER_VALIDATE_INT);
            if($age === false) {
                echo ‘请输入正确的年龄‘;
                exit;
            }
        }

        //验证小数,如果填写了salary则进行验证
        if(strlen(filter_input(INPUT_POST, ‘salary‘)) > 0) {
            $salary = filter_input(INPUT_POST, ‘salary‘, FILTER_VALIDATE_FLOAT);
            if($salary === false) {
                echo ‘请输入正确的薪资‘;
                exit;
            }
        }

        //验证下拉菜单
        if(! (filter_has_var(INPUT_POST, ‘food‘) && array_key_exists($_POST[‘food‘], $choices))) {
            echo ‘请选择喜欢的食物‘;
            exit;
        }

        //验证性别
        if(! (filter_has_var(INPUT_POST, ‘sex‘) && in_array($_POST[‘sex‘], $sex))) {
            echo ‘请选择性别‘;
            exit;
        }

        //验证时间
        if(filter_has_var(INPUT_POST, ‘time‘)) {
            foreach($_POST[‘time‘] as $time) {
                @list($year, $month, $day) = explode(‘-‘, $time);
                if(! @checkdate($month, $day, $year)) {
                    echo ‘时间错误‘;
                    exit;
                }
                //时间段验证(略)
            }
        }

        echo ‘Hello, ‘,$_POST[‘username‘];
        var_dump($_POST);
    }
?>

参考:

<PHP Cookbook>,3rd

php.net:http://php.net/manual/zh/book.filter.php

w3school:http://www.w3school.com.cn/php/php_filter.asp

时间: 2024-10-10 22:04:52

使用 PHP 过滤器(Filter)进行严格表单验证的相关文章

angularJS 过滤器 表单验证

过滤器1.filter的作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果,主要用于数据的格式化.2.内置过滤器(1)Currency(货币)将一个数值格式化为货币格式,默认为$(2)Date(3)Filter子串匹配用来处理一个数组,可以过滤出含有某个子串的元素,作为一个字数组来返回.通常用来过滤需要展示的元素.可以是字符串数字,对象或是一个用来从数组中选择元素的函数.字符串:返回所有包含这个字符串的元素对象:将待过滤对象的属性同这个对象中的同名属性进行对比,如果属性值是字符串就

AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)

这一节相对来说需要理解的东西不是太多,记住了那些api就行了. 还是一个案例(同样来自miaov),一个表单验证,先上代码,然后再对对应的内容进行解释. <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8"> <title>Title</title> </head>

从浅入深剖析angular表单验证

最近手上维护的组件剩下的BUG都是表单验证,而且公司的表单验证那块代码经历的几代人,里面的逻辑开始变得不清晰,而且代码结构不是很angular. 是很有必要深入了解表单验证. <body ng-controller="MainController"> <form name="form" novalidate="novalidate"> <input name="text" type="e

java 表单验证

1.思路:通过表单选择器,表单属性过滤器提取每个表单提交的值,进行验证 2.实现:javascript通过 onSubmit()事件,判断,返回值false不提交,返回true提交,jquery通过submit()事件 3.表单验证常用的方法和事件 a:事件 onblur 失去焦点, onfocus获得焦点 b:方法 blur() 移开焦点触发方法参数 focus() 在文本域中设置焦点 触发方法参数 select()选取文本域中的内容触发方法参数 4.正则表达式: a:定义 var reg =

基于angularJS的表单验证练习

今天看了一下angularJS的表单验证,看的有点云里雾里(也有可能是雾霾吸多了),于是做了一个小练习来巩固一下. html: <div ng-controller="Aaa"> <form novalidate name="loginForm"> <div> <label>用户名</label> <input type="text" name="nText"

如何利用jQuery进行简单表单验证

如何利用jQuery进行简单表单验证:利用jQuery可以进行表单验证,当然有比较复杂的表单验证,这里就不介绍了,下面就简单介绍一下如何使用jQuery进行简单的表单验证,然后大家可以通过改造进行基本的表达验证了.先看一段代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http

Yii学习笔记之四(表单验证 api 翻译)

1.表单验证 对于用户输入的所有数据,你不能信任,必须加以验证. 所有框架如此,对于yii 可以使用函数 yii\base\Model::validate()  进行验证 他会返回boolean值的 true /false 如果验证未通过,可以使用 yii\base\Model::$errors 属性进行处理,如下代码: <?php //加载表单模型(绝对地址方式) /*如果上面引入 use app\models\ContactForm; 则可以直接使用 $model = new Contact

SpringMVC与SiteMesh2.4无缝整合并借助JSR303规范实现表单验证

首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ht

再说表单验证,在Web Api中使用ModelState进行接口参数验证

写在前面 上篇文章中说到了表单验证的问题,然后尝试了一下用扩展方法实现链式编程,评论区大家讨论的非常激烈也推荐了一些很强大的验证插件.其中一位园友提到了说可以使用MVC的ModelState,因为之前通常都在Web项目中用没在Api项目用过,想想Api方法接收的多参数都封装成了一个实体类,独立于数据Model层,这样其实很方便用ModelState做验证,于是尝试了一下. 认识ModelState 我们都知道在MVC中使用ModelState实现表单验证非常简单,借助jquery.validat

jQuery 表单应用:全选/取消全选,表单验证,网页选项卡切换

应用一:单行文本框应用 需要用到的 API focus([[data],fn])   --> 当元素获得焦点时,触发 focus 事件 blur([[data],fn])     --> 当元素失去焦点时,触发 blur 事件 <!DOCTYPE html> <html> <head lang="en">     <meta charset="UTF-8">     <title></ti