ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 过滤与清理 清理用户输入是软件开发的关键部分。信任或忽略对用户输入进行清理可能导致未经授权访问应用程序的内容,主要是用户数据,甚至是托管应用程序的服务器。 ![](https://docs.phalconphp.com/images/content/filter-sql.png) [完整大图](http://xkcd.com/327) `Phalcon\Filter` 组件提供了一组常用的过滤器和数据清理助手。它提供围绕PHP过滤器扩展的面向对象的包装器。 ## 内置过滤器的类型 以下是此组件提供的内置过滤器: | 名称 | 描述 | | ------------- | ------------------------------------------------------------------------------------------------------------- | | string |剥离标签并对HTML实体进行编码,包括单引号和双引号 | | email | 删除除字母,数字和 ``!#$%&*+-/=?^_`{\|}~@.[]`` 之外的所有字符 | | int |删除除数字,加号和减号以外的所有字符 | | int! | 使用[intval](http://php.net/manual/en/function.intval.php)函数将值转换为整数值 | | absint | 获取已转换为整数的值的绝对值 | | float | 删除除数字,点,加号和减号以外的所有字符 | | float! | 使用[floatval](http://php.net/manual/en/function.floatval.php)函数将值转换为浮点值 | | alphanum | 删除[a-zA-Z0-9]以外的所有字符 | | striptags | 应用[strip_tags](http://www.php.net/manual/en/function.strip-tags.php)函数 | | special_chars | 转义'“<>&和ASCII值小于32的字符 | | trim | 应用 [trim](http://www.php.net/manual/en/function.trim.php) 函数 | | lower | 应用 [strtolower](http://www.php.net/manual/en/function.strtolower.php) 函数 | | url | 删除除字母,数字和 ``&#124;$`-_.+!*'(),{}[]<>#%";/?:@&=.^\\~`` 之外的所有字符 | | upper | 应用 [strtoupper](http://www.php.net/manual/en/function.strtoupper.php) 函数 | ## 清理数据 清理是从值中删除特定字符的过程,用户或应用程序不需要或不需要这些字符。通过清理输入,我们确保应用程序的完整性将保持不变。 ```php <?php use Phalcon\Filter; $filter = new Filter(); // Returns 'someone@example.com' $filter->sanitize('some(one)@exa\mple.com', 'email'); // Returns 'hello' $filter->sanitize('hello<<', 'string'); // Returns '100019' $filter->sanitize('!100a019', 'int'); // Returns '100019.01' $filter->sanitize('!100a019.01a', 'float'); ``` ## 从控制器清理 访问`GET`或`POST`输入数据时(通过请求对象),您可以从控制器访问`Phalcon\Filter`对象。第一个参数是要获取的变量的名称;第二个是要应用的过滤器。 ```php <?php use Phalcon\Mvc\Controller; class ProductsController extends Controller { public function indexAction() { } public function saveAction() { // Sanitizing price from input $price = $this->request->getPost('price', 'double'); // Sanitizing email from input $email = $this->request->getPost('customerEmail', 'email'); } } ``` ## 过滤操作参数 下一个示例显示如何清理控制器操作中的操作参数: ```php <?php use Phalcon\Mvc\Controller; class ProductsController extends Controller { public function indexAction() { } public function showAction($productId) { $productId = $this->filter->sanitize($productId, 'int'); } } ``` ## 过滤数据 除了清理之外, `Phalcon\Filter`还通过删除或修改输入数据到我们期望的格式来提供过滤。 ```php <?php use Phalcon\Filter; $filter = new Filter(); // Returns 'Hello' $filter->sanitize('<h1>Hello</h1>', 'striptags'); // Returns 'Hello' $filter->sanitize(' Hello ', 'trim'); ``` <a name='combining-filters'></a> ## 结合过滤器 您还可以通过将过滤器标识符数组作为第二个参数传递,同时对字符串运行多个过滤器: ```php <?php use Phalcon\Filter; $filter = new Filter(); // Returns 'Hello' $filter->sanitize( ' <h1> Hello </h1> ', [ 'striptags', 'trim', ] ); ``` ## 添加过滤器 您可以将自己的过滤器添加到`Phalcon\Filter`。过滤函数可以是匿名函数: ```php <?php use Phalcon\Filter; $filter = new Filter(); // Using an anonymous function $filter->add( 'md5', function ($value) { return preg_replace('/[^0-9a-f]/', '', $value); } ); // Sanitize with the 'md5' filter $filtered = $filter->sanitize($possibleMd5, 'md5'); ``` 或者,如果您愿意,可以在类中实现过滤器: ```php <?php use Phalcon\Filter; class IPv4Filter { public function filter($value) { return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4); } } $filter = new Filter(); // Using an object $filter->add( 'ipv4', new IPv4Filter() ); // Sanitize with the 'ipv4' filter $filteredIp = $filter->sanitize('127.0.0.1', 'ipv4'); ``` ## 复杂的清理和过滤 PHP本身提供了一个很好的过滤扩展,您可以使用。查看其文档:[PHP文档中的数据过滤](http://www.php.net/manual/en/book.filter.php) ## 实现自己的过滤器 必须实现`Phalcon\FilterInterface`接口才能创建自己的过滤服务,取代Phalcon提供的过滤服务。