zoukankan      html  css  js  c++  java
  • PHP中使用Filter进行数据安全过滤

    安全是个永恒的话题,任何一个PHPer都免不了要过数据验证及过滤这一关。通常的验证方法,相信只要有点经验的PHPer都能写个八九不离十,只是安全性高低的问题。这里我来介绍一种利用PHP的Filter来进行验证的方法,既简单又高效。
    Filter曾作为PHP扩展(PECL)的一部分,使用时需要加载外部库文件,但在PHP 5.2之后的版本已编译到PHP中,使用时无需加载。目前filter提供函数有:filter_has_var、filter_id、 filter_input_array、filter_input、filter_var_array、filter_var。限于篇幅,这里只介绍两个最常使用的,filter_var和filter_input。filter_var用于页面内部变量的内容过滤,filter_input用于外部变量(如POST、GET、COOKIE等)的内容过滤。

    首先来介绍filter_var函数,先看下函数原型:
    mixed filter_var ( mixed $variable [, int $filter [, mixed $options ]] )
    $variable——要过滤的变量
    $filter——要过滤的类型ID常量
    $options——过滤类型参数
    其中需要重点掌握的是$filter参数,它是一些有特殊含义的预定义常量,如:FILTER_VALIDATE_INT代表验证整数型变量,FILTER_VALIDATE_EMAIL代表验证email格式等。(更多常量可以查看PHP手册关于Filter部分的内容,里面有该参数的详细列表)
    对于返回值的情况,匹配时,匹配正确返回原内容,匹配错误时返回false;过滤时,返回过滤后内容。
    下面是一些使用例子:

    1.  //整型格式测试   
    2. $var = '12345';  
    3. var_dump(filter_var($var, FILTER_VALIDATE_INT));  
    4. $var = '12B45';  
    5. var_dump(filter_var($var, FILTER_VALIDATE_INT));  
    6. //Email格式测试   
    7. $var = 'linvo@126.com';  
    8. var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));  
    9. $var = 'linvo@126com';  
    10. var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));  
    11. //IP格式测试   
    12. $var = '11.22.33.44';  
    13. var_dump(filter_var($var, FILTER_VALIDATE_IP));  
    14. $var = '111.222.333.444';  
    15. var_dump(filter_var($var, FILTER_VALIDATE_IP));  
    16. //URL格式测试   
    17. $var = 'http://www.linvo2008.cn/blog';  
    18. var_dump(filter_var($var, FILTER_VALIDATE_URL));  
    19. $var = 'www.linvo2008.cn/blog';  
    20. var_dump(filter_var($var, FILTER_VALIDATE_URL));  
    21. //去除超文本标签测试   
    22. $var = 'This is a <a href="#" mce_href="#">link</a> test!';  
    23. var_dump(filter_var($var, FILTER_SANITIZE_STRING));  
     

    大家可以自己运行一下看看结果。另外,对于第三个$options参数,可以对验证类型进行详细设置。比如验证IP时,可以通过该参数设置过滤规则为IPv4还是IPv6:

    1. //IPv6格式测试(支持缩写形式)   
    2. $var = '2001:0db8:85a3::1319:8a2e:0370:7344';  
    3. var_dump(filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6));  
     

    其他详细参数见PHP手册。

    以上是页面内部变量的过滤,但我们希望的是可以直接验证用户输入的数据,这些数据是外部变量过来的,这就用到了filter_input函数:
    mixed filter_input ( int $type , string $variable_name [, int $filter [, mixed $options ]] )
    从函数原型可以看出,除了原来那三个参数外,多了第一个$type参数。该参数用于设置要过滤变量所在的数组,也就相当于:post方式过来的保存在$_POST数组中;get方式过来的保存在$_GET数组中一样。它也是通过预定义常量进行设置的,如:post对应INPUT_POST,get对应INPUT_GET等。(更多常量见PHP手册)
    下面也来个例子吧,该例子由两个页面组成:index.html前端表单页面;do.php后端处理页面。
    file:index.html

    1. <form action="do.php" method="post">  
    2. <label>Name:</label>  
    3. <input name="name" type="text" />  
    4. <label>QQ:</label>  
    5. <input name="qq" type="text" />  
    6. <label>Email:</label>  
    7. <input name="email" type="text" />  
    8. <label>Blog:</label>  
    9. <input name="blog" type="text" />  
    10. <input type="submit" />  
    11. </form>  
     

    file:do.php

    1. $name  = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);  
    2. $qq  = filter_input(INPUT_POST, 'qq', FILTER_VALIDATE_INT);  
    3. $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);  
    4. $blog  = filter_input(INPUT_POST, 'blog', FILTER_VALIDATE_URL);   
    5. $error  = '<em>Error</em>';  
    6. echo 'Name:',$name;  
    7. $msg  = $qq === false ? $error : $qq;  
    8. echo 'QQ:',$msg;  
    9. $msg  = $email === false ? $error : $email;  
    10. echo 'Email:',$msg;  
    11. $msg  = $blog === false ? $error : $blog;  
    12. echo 'Blog:',$msg;  
     

    index.html页面演示效果(提交前):
    index.html

    do.php页面演示效果(提交后):
    do.php
    到这里,大家应该基本掌握了Filter的使用了,更多用途等待大家自己去发掘:)

    ---------------------------------------------------------------

    来源:http://blog.csdn.net/linvo/article/details/3893674

  • 相关阅读:
    在线|九月月考选填题
    函数$f(x)=e^xpm e^{-x}$相关
    偶函数性质的推广
    2020年全国卷Ⅱ卷文科数学选填题解析版
    2020年全国卷Ⅱ卷文科数学解答题解析版
    待定系数法
    特殊方法求函数解析式
    phd文献阅读日志-4.1
    phd文献阅读日志-1.2~3.2(1.2,2.1,2.2,3.1,3.2)
    完美解决linux下vim在终端不能用鼠标复制的问题
  • 原文地址:https://www.cnblogs.com/y0umer/p/3838801.html
Copyright © 2011-2022 走看看