设为首页 收藏本站
查看: 393|回复: 0

[经验分享] PHP中使用Filter进行数据安全过滤

[复制链接]

尚未签到

发表于 2017-4-7 10:26:22 | 显示全部楼层 |阅读模式
  安全是个永恒的话题,任何一个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;过滤时,返回过滤后内容。
  

下面是一些使用例子:

<?
//整型格式测试
$var = '12345';
var_dump(filter_var($var, FILTER_VALIDATE_INT));
$var = '12B45';
var_dump(filter_var($var, FILTER_VALIDATE_INT));
$var=300;
$int_options = array("options"=>array("min_range"=>0, "max_range"=>256));
var_dump(filter_var($var, FILTER_VALIDATE_INT
, $int_options))
//Email格式测试
$var = 'linvo@126.com';
var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));
$var = 'linvo@126com';
var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));
//IP格式测试
$var = '11.22.33.44';
var_dump(filter_var($var, FILTER_VALIDATE_IP));
$var = '111.222.333.444';
var_dump(filter_var($var, FILTER_VALIDATE_IP));
//URL格式测试
$var = 'http://www.linvo2008.cn/blog';
var_dump(filter_var($var, FILTER_VALIDATE_URL));
$var = 'www.linvo2008.cn/blog';
var_dump(filter_var($var, FILTER_VALIDATE_URL));
//去除超文本标签测试
$var = 'This is a <a href="#" mce_href="#">link</a> test!';
var_dump(filter_var($var, FILTER_SANITIZE_STRING));
   大家可以自己运行一下看看结果。另外,对于第三个$options参数,可以对验证类型进行详细设置。比如验证IP时,可以通过该参数设置过滤规则为IPv4还是IPv6:

<?
//IPv6格式测试(支持缩写形式)
$var = '2001:0db8:85a3::1319:8a2e:0370:7344';
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

<form action="do.php" method="post">
<label>Name:</label>
<input name="name" type="text" />
<label>QQ:</label>
<input name="qq" type="text" />
<label>Email:</label>
<input name="email" type="text" />
<label>Blog:</label>
<input name="blog" type="text" />
<input type="submit" />
</form>
   file:do.php

<?
$name  = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
$qq  = filter_input(INPUT_POST, 'qq', FILTER_VALIDATE_INT);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$blog  = filter_input(INPUT_POST, 'blog', FILTER_VALIDATE_URL);
$error  = '<em>Error</em>';
echo 'Name:',$name;
$msg  = $qq === false ? $error : $qq;
echo 'QQ:',$msg;
$msg  = $email === false ? $error : $email;
echo 'Email:',$msg;
$msg  = $blog === false ? $error : $blog;
echo 'Blog:',$msg;
   index.html页面演示效果(提交前):
  do.php页面演示效果(提交后):


到这里,大家应该基本掌握了Filter的使用了,更多用途等待大家自己去发掘:)
  参考:http://www.w3school.com.cn/php/php_ref_filter.asp

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-361410-1-1.html 上篇帖子: 使用Xdebug调试和优化PHP程序[3] 下篇帖子: 怎样才能成为PHP高手?学会"懒惰"的编程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表