永远不要相信客户端提交的数据,所以对于输入数据的过滤势在必行,我们建议: - 开启[令牌验证](#)避免数据的重复提交; - 使用[自动验证](#)和[自动完成](#)机制进行初步过滤; - 使用系统提供的[I函数](#)获取用户输入数据; - 对不同的应用需求设置不同的安全过滤函数,常见的安全过滤函数包括stripslashes、htmlentities、htmlspecialchars和strip_tags等; ## 使用I函数过滤 使用系统内置的`I函数`是避免输入数据出现安全隐患的重要手段,I函数默认的过滤方法是`htmlspecialchars`,如果我们需要采用其他的方法进行安全过滤,有两种方式: 如果是全局的过滤方法,那么可以设置DEFAULT_FILTER,例如: ~~~ 'DEFAULT_FILTER' => 'strip_tags', ~~~ 设置了DEFAULT_FILTER后,所有的I函数调用默认都会使用`strip_tags`进行过滤。 当然,我们也可以设置多个过滤方法,例如: ~~~ 'DEFAULT_FILTER' => 'strip_tags,stripslashes', ~~~ 如果是仅需要对个别数据采用特殊的过滤方法,可以在调用I函数的时候传入过滤方法,例如: ~~~ I('post.id',0,'intval'); // 用intval过滤$_POST['id'] I('get.title','','strip_tags'); // 用strip_tags过滤$_GET['title'] ~~~ > 要尽量避免直接使用$_GET $_POST $_REQUEST 等数据,这些可能会导致安全的隐患。 就算你要获取整个$_GET数据,我们也建议你使用 `I('get.')` 的方式 ## 写入数据过滤 如果你没有使用I函数进行数据过滤的话,还可以在模型的写入操作之前调用**filter**方法对数据进行安全过滤,例如: ~~~ $this->data($data)->filter('strip_tags')->add(); ~~~