[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 | 删除除字母,数字和 ``|$`-_.+!*'(),{}[]<>#%";/?:@&=.^\\~`` 之外的所有字符 |
| 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提供的过滤服务。
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持