Zend framework 扩展Zend请求对象getParams()方法以清理用户输入

Zend framework 扩展Zend请求对象getParams()方法以清理用户输入,zend-framework,blacklist,centralized,input-sanitization,Zend Framework,Blacklist,Centralized,Input Sanitization,我试图通过过滤用户输入(将标签等用户数据列入黑名单),确保我们在web应用程序中清理用户输入。基本上,Zend建议开发人员在将其视为需求的任何地方都可以专门执行此操作,因此如果页面a有表单,则应在检索表单数据后在其PageAAAction()中执行过滤。我的应用程序中的所有表单数据的检索方式如下: $this->_request->getParams(); $this->_request->getParam('specificParamName'); // to ret

我试图通过过滤用户输入(将标签等用户数据列入黑名单),确保我们在web应用程序中清理用户输入。基本上,Zend建议开发人员在将其视为需求的任何地方都可以专门执行此操作,因此如果页面a有表单,则应在检索表单数据后在其PageAAAction()中执行过滤。我的应用程序中的所有表单数据的检索方式如下:

$this->_request->getParams(); 
$this->_request->getParam('specificParamName'); // to return specific param
嗯,在我的web应用程序中,所有用户输入都需要针对黑名单字段进行消毒。显然,我希望我的代码集中在一个地方,而不是与每个表单的黑名单进行比较。我的理解是,这应该/必须在_request对象的getParams()或getParam()方法中完成,因为这是我们总是从中检索表单数据的地方

如果是,我怎么做?我不想触碰核心Zend类并向其添加我自己的修改

如果不是,那么集中代码的最佳策略是什么


免责声明:我们没有使用Zend表单,而是使用
getParams
getParam
自定义编写我们自己的表单,这不会从表单中清除数据,您应该改为使用
$form->getData($post)
$form->getValidData($post)

    class UserController extends Custom_Controller_Abstract
    {

        $user = $this->getSafeParam('userid');
    }

然而,不久前我也问了这个问题,其中有一些很好的答案——其中一个是不要按照你的意愿去做(就像我做的那样)。

使用
getParams
getParam
不会清理表单中的数据,你应该使用
$form->getData($post)
$form->getValidData($post)


然而,我不久前也问过这个问题,其中有一些很好的答案——其中一个是不按您的意愿(和我一样)执行操作。

您可以扩展控制器类以实现自定义函数来清理输入。
    class UserController extends Custom_Controller_Abstract
    {

        $user = $this->getSafeParam('userid');
    }
在library/custom/controller/Abstract.php中

    class UserController extends Custom_Controller_Abstract
    {

        $user = $this->getSafeParam('userid');
    }
    class Custom_Controller_Abstract extends Zend_Controller_Action
    {



        public function getSafeParam($paramName)
        {
            return sanitize($this->getRequest()->getParam($key));
        }

        protected function sanitize($value)
        {
            return $value;
        }
    }

您可以扩展控制器类以实现自定义函数来清理输入
    class UserController extends Custom_Controller_Abstract
    {

        $user = $this->getSafeParam('userid');
    }
在library/custom/controller/Abstract.php中

    class UserController extends Custom_Controller_Abstract
    {

        $user = $this->getSafeParam('userid');
    }
    class Custom_Controller_Abstract extends Zend_Controller_Action
    {



        public function getSafeParam($paramName)
        {
            return sanitize($this->getRequest()->getParam($key));
        }

        protected function sanitize($value)
        {
            return $value;
        }
    }

Zend让我们执行自己的数据卫生,因为各个领域的需求变化很大

显然,您没有使用Zend_表单构建表单,或者您将使用
Zend_表单
中包含的标准过滤器和验证器

当不使用Zend_表单时,您可以访问Zend_表单使用的相同验证器和过滤器。 使用
Zend\u Filter\u Input
时,这些选项可用

Zend_Filter_Input专门设计用于过滤和验证包含在关联数组中的信息,如购买
$\u GET
$\u POST
数组中提供的信息

基本用法都在控制器/操作中:

$filters = array(
    //month is the array key, Digits is the name of the filter class
    'month'   => 'Digits',
    //account is the array key, Digits is the name of the filter class
    'account' => 'StringTrim'
);

$validators = array(
    //account is the array key, Digits is the name of the validator class
    'account' => 'Alpha',
    //* is a valid wildcard for validators and filters
    '*' => 'NotEmpty'
);

$data = $this->getRequest()->getPost();

//everything in the constructor
$input = new Zend_Filter_Input($filters, $validators, $data);

//or
$input = new Zend_Filter_Input($filters, $validators);
$input->setData($data);

过滤器和验证器还有很多工作要做,请查看更多信息。

Zend让我们自己对数据进行清理,因为各个领域的需求变化很大

显然,您没有使用Zend_表单构建表单,或者您将使用
Zend_表单
中包含的标准过滤器和验证器

当不使用Zend_表单时,您可以访问Zend_表单使用的相同验证器和过滤器。 使用
Zend\u Filter\u Input
时,这些选项可用

Zend_Filter_Input专门设计用于过滤和验证包含在关联数组中的信息,如购买
$\u GET
$\u POST
数组中提供的信息

基本用法都在控制器/操作中:

$filters = array(
    //month is the array key, Digits is the name of the filter class
    'month'   => 'Digits',
    //account is the array key, Digits is the name of the filter class
    'account' => 'StringTrim'
);

$validators = array(
    //account is the array key, Digits is the name of the validator class
    'account' => 'Alpha',
    //* is a valid wildcard for validators and filters
    '*' => 'NotEmpty'
);

$data = $this->getRequest()->getPost();

//everything in the constructor
$input = new Zend_Filter_Input($filters, $validators, $data);

//or
$input = new Zend_Filter_Input($filters, $validators);
$input->setData($data);

过滤器和验证器还有很多工作要做,请查看更多信息。

只需创建一个基本表单对象,将过滤器应用于所有字段即可。然后让表单扩展itI应该在我的问题中说明这一点,但我们不使用Zend forms(不幸的是,我没有做出这个决定),只需创建一个基本表单对象,将过滤器应用于所有字段。然后让您的表单扩展itI应该在我的问题中说明这一点,但我们不使用Zend表单(不幸的是,我没有做出此决定)谢谢@Ashley,但不幸的是,我们的产品使用Smarty模板,因此Zend表单无法使用。我们确实需要一个变通方法谢谢@Ashley,但不幸的是我们的产品使用Smarty模板,因此不能使用Zend表单。我们确实需要一个解决办法谢谢@RockyFord。是的,我们没有使用Zend表单,所以我想我必须使用Zend_Filter_输入。在您的示例中,它要求我在从表单检索用户数据的每个控制器中应用Zend_Filter_输入。在我的例子中,我只想检查表单中是否有黑名单中的单词,这通常适用于所有表单。所以我想要一个中心位置,而不是重复地将其应用于所有控制器,所以将该功能构建到某种类型的服务模型或插件中。我只提供了该方法的一个基本示例,如何使用它取决于您。您还可能希望使用javascript将黑名单用作预兆,然后在应用程序中进行更彻底的清理。谢谢@RockyFord。是的,我们没有使用Zend表单,所以我想我必须使用Zend_Filter_输入。在您的示例中,它要求我在从表单检索用户数据的每个控制器中应用Zend_Filter_输入。在我的例子中,我只想检查表单中是否有黑名单中的单词,这通常适用于所有表单。所以我想要一个中心位置,而不是重复地将其应用于所有控制器,所以将该功能构建到某种类型的服务模型或插件中。我只提供了该方法的一个基本示例,如何使用它取决于您。您也可以向我们咨询