发布于 2015-08-21 15:16:25 | 279 次阅读 | 评论: 0 | 来源: 网络整理
清理用户输入是软件开发中很重要的一个环节。信任或者忽略对用户输入数据作清理可能会导致 对应用内容(主要是用户数据),甚至你应用所处在的服务器的非法访问。
此 PhalconFilter 组件提供了一系列通用可用的过滤器和数据清理助手。它提供了围绕于PHP过滤扩展的面向对象包装。
清理是指从一个值中移除特定字符的过程,此过程对用户和应用不是必须,也不是他们想得到的。 通过清理输入,我们确保了应用的完整性和正确性。
<?php
use PhalconFilter;
$filter = new Filter();
// 返回 "someone@example.com"
$filter->sanitize("some(one)@example.com", "email");
// 返回 "hello"
$filter->sanitize("hello<<", "string");
// 返回 "100019"
$filter->sanitize("!100a019", "int");
// 返回 "100019.01"
$filter->sanitize("!100a019.01a", "float");
当接收到GET或POST的数据时(通过请求对象),你可以在控制器中访问一个 PhalconFilter 对象。 第一个参数是等待获得变量的名字,第二个参数是将应用在此变量的过滤器。
<?php
use PhalconMvcController;
class ProductsController extends Controller
{
public function indexAction()
{
}
public function saveAction()
{
// 从输入中清理price
$price = $this->request->getPost("price", "double");
// 从输入中清理email
$email = $this->request->getPost("customerEmail", "email");
}
}
接下来的示例演示了在一个控制器的动作中如何清理动作的参数:
<?php
use PhalconMvcController;
class ProductsController extends Controller
{
public function indexAction()
{
}
public function showAction($productId)
{
$productId = $this->filter->sanitize($productId, "int");
}
}
此外, PhalconFilter 也提供了可以进行删除或者修改输入数据以满足我们需要的格式的过滤器。
<?php
use PhalconFilter;
$filter = new Filter();
// 返回 "Hello"
$filter->sanitize("<h1>Hello</h1>", "striptags");
// 返回 "Hello"
$filter->sanitize(" Hello ", "trim");
以下是该容器提供的内置过滤器:
你可以将你自己的过滤器添加到 PhalconFilter 。过滤器的方法可以是匿名函数:
<?php
use PhalconFilter;
$filter = new Filter();
// 使用匿名函数
$filter->add('md5', function ($value) {
return preg_replace('/[^0-9a-f]/', '', $value);
});
// 利用md5过滤器清理
$filtered = $filter->sanitize($possibleMd5, "md5");
或者,如果你愿意,你可以在类中实现过滤器:
<?php
use PhalconFilter;
class IPv4Filter
{
public function filter($value)
{
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
}
}
$filter = new Filter();
// 使用对象
$filter->add('ipv4', new IPv4Filter());
// 利用"ipv4"过滤器清理
$filteredIp = $filter->sanitize("127.0.0.1", "ipv4");
你可以使用PHP本身提供的优秀过滤器扩展。请查看对应的文档: PHP文档上的数据过滤器
如需创建你自己的过滤器并代替Phalcon提供的过滤器,你需要实现 PhalconFilterInterface 接口。