[TOC]
# 過濾與清理
清理用戶輸入是軟件開發的關鍵部分。信任或忽略對用戶輸入進行清理可能導致未經授權訪問應用程序的內容,主要是用戶數據,甚至是托管應用程序的服務器。

[完整大圖](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管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持