php的filter扩展小技巧

发表于:2014-01-20来源:IT博客大学习作者:Volcano点击数: 标签:php
做为一个合格的web开发人员,一定会牢记一个原则――永远不能相信用户输入的数据,行走江湖,安全第一是很重要的。用户通过表单或url传过来的数据,一定要仔细检查过了,才往后台数据库里存进去。

  做为一个合格的web开发人员,一定会牢记一个原则――永远不能相信用户输入的数据,行走江湖,安全第一是很重要的。用户通过表单或url传过来的数据,一定要仔细检查过了,才往后台数据库里存进去。在一个成熟的开发团队里,贯彻这个原则不成问题;但是如果在一个新人老手混搭的小team里,很容易就忽视了这个问题,那么各种安全漏洞比如跨站攻击,sql注入等等真是防不胜防。

  实际上,用php 5自带的filter扩展能够较好的解决这个问题。我在从前的blog里记录了filter扩展的常规用法――直接利用filter来校验数据,这样有不少额外的代码量,所以我得介绍一个比较偷懒的办法――自动对所有输入变量进行过滤,这只需要对php.ini增加一行配置,然后重启apache或fastcgi让php配置生效。

  filter.default="special_chars"

  开启了这项配置后,会自动使用filter_input方法对$_GET, $_POST, $_COOKIE, $_REQUEST以及$_SERVER变量进行过滤转义。配置中special_chars是常量FILTER_SANITIZE_SPECIAL_CHARS的缩写,它能自动转义大部分危险字符例如: '"<>。而php手册对它的解释是:

  HTML-escape '"<>& and characters with ASCII value less than 32, optionally strip or encode other special characters.

  在这个情况下,新人们写出这样的代码我也不会太担心:

  PHP:

  $foo = $_GET['foo'];

  echo $foo;

  在部分场合,我们可能还是需要未转义的变量,比如某个ajax接受的参数是一段json串,用这段代码即可获得原始数据:

  PHP:

  $foo = filter_input (INPUT_GET, 'foo', FILTER_UNSAFE_RAW);

  fitler扩展与yahoo使用的yiv如出一辙,印象里似乎就是yahoo对yiv做了些修改贡献给php社区,但是暂时没找到出处。

原文转自:http://blogread.cn/it/article/1515