ThinkPHP实战
上QQ阅读APP看书,第一时间看更新

4.10 读取输入

在实际开发过程中,存在一条黄金守则“永远不要相信用户的输入”,需要经常读取系统变量或者用户提交的数据,这些数据是不受信任的,很容易引起安全隐患,如果利用好ThinkPHP提供的变量输入功能,就可以避免这种问题了。

传统的变量读取方式:

        $id = $_GET['id'];
        $username = $_POST['username'];
        $uid = $_SESSION['user_id'];
        $cookie = $_COOKIE['cookie'];
        $host = $_SERVER['HTTP_HOST'];

ThinkPHP框架中使用“I”函数进行变量的获取和过滤,函数定义如下:

I(’变量来源.变量名/修饰符’, [’默认值’], [’过滤方法’], [’额外数据源’])

变量来源指变量的来源数组,如来源于$_GET、$_POST,完整来源定义如表4-2所示。

表4-2

变量来源不区分大小写,变量名区分大小写。

以POST为例,说明I函数的使用:

   echo I('post.username'); //等效于echo $_POST['username'];

1.默认值

      echo I('post.username', 'admin'); //如果$_POST['username']为空,则输出“admin”

2.过滤方法

      echo I('post.username', '', 'htmlspecialchars'); //等效于echo
  htmlspecialchars(empty($_POST['username'])? '': $_POST['username'])

I函数支持获取整个变量数组,如:I(‘post.')等效于$_POST。

如果在调用I函数时没有指定过滤方法,系统会采用配置“DEFAULT_FILTER”的值(默认为htmlspecialchars)作为函数进行过滤,该参数支持多个过滤函数,例如:

   “DEFAULT_FILTER”=>'strip_tags, htmlspecialchars'

I(‘post.username')等效于htmlspecialchars(strip_tags($_POST[‘username'])),请注意函数调用顺序。

I函数的第三个参数如果传入的是函数名,则使用该函数对变量进行操作并返回操作结果(如果变量是数组,则使用array_map进行处理),否则调用PHP内置的filter_var方法进行处理,例如:I(‘post.email', '', FILTER_VALIDATE_EMAIL)等效于filter_var($_POST[‘email'], FILTER_VALIDATE_EMAIL)。

3.正则过滤

   I('post.username', '', '/^[A-Za-z0-9]+$/');

如果正则匹配失败,返回默认值。

4.不进行任何过滤

某些情况下,不希望开启过滤功能,比如CMS系统中的文章内容,该内容由富文本编辑器生成,带有HTML标记,如果不做任何处理,该值会被ThinkPHP进行htmlspecialchars处理。使用I('post.content', ", false)来关闭过滤方法处理。

5.变量修饰符

在需要指定变量值的格式时,可以使用变量修饰符,可用修饰符如表4-3所示。

表4-3

使用方法如下:

      I('post.username/s'); //强制转换username为字符串
      I('post.uid/d'); //强制转换uid为整型