【问题标题】:Handling input with the Zend Framework (Post,get,etc)使用 Zend 框架处理输入(Post、get 等)
【发布时间】:2010-10-02 06:42:13
【问题描述】:

我在 zend 代码上重构 php,所有代码都充满了 $_GET["this"]$_POST["that"]。我一直使用比较 phpish 的 $this->_request->getPost('this')$this->_request->getQuery('that')(这个用 getquery 而不是 getGet 不太合乎逻辑)。

所以我想知道我的方法是否更安全/更好/更容易维护。我在 Zend Framework 文档中读到,您必须验证自己的输入,因为请求对象不会这样做。

这给我留下了 2 个问题:

  • 这两者中哪一个最好? (或者如果有其他更好的方法)
  • 使用这种方法验证 php 输入的最佳做法是什么?

谢谢!

【问题讨论】:

    标签: php zend-framework post input get


    【解决方案1】:

    我通常使用 $this->_request->getParams();检索帖子或 URL 参数。然后我使用Zend_Filter_Input 进行验证和过滤。 getParams() 不进行验证。

    使用 Zend_Filter_Input 您可以使用 Zend Validators 进行应用程序级别的验证(或者您也可以编写自己的)。例如,您可以确保“月”字段是一个数字:

    $data = $this->_request->getParams();
    
    $validators = array(
        'month'   => 'Digits',
    );
    
    $input = new Zend_Filter_Input($filters, $validators, $data);
    

    【讨论】:

    • 我同意并且还建议查看 Zend Form,因为您可以将过滤器和验证器附加到表单,然后使用该表单对象验证所有传入的输入。别介意它是一个表单对象——它也是一个过滤器/验证器容器。
    【解决方案2】:

    扩展布赖恩的答案。

    如您所述,您还可以查看$this->_request->getPost()$this->_request->getQuery()。如果您概括 getParams(),这有点像使用 $_REQUEST 超全局,我认为这在安全性方面是不可接受的。

    除了 Zend_Filter,您还可以使用简单的 PHP 来转换所需的内容。

    例如:

    $id = (int) $this->_request->getQuery('id');
    

    对于其他值,它变得更加复杂,因此请确保例如在您的数据库查询中引用(Zend_Db,请参阅引用标识符,$db->quoteIdentifier())并在视图中使用 $this->escape($var); 转义内容。

    【讨论】:

      【解决方案3】:

      您不能为获取/发布数据编写一刀切的验证函数。在某些情况下,您需要一个字段为整数,而在其他情况下,您需要一个日期。这就是 zend 框架中没有输入验证的原因。

      您必须在需要的地方编写验证代码。您当然可以编写一些辅助方法,但您不能指望 getPost() 自己为您验证某些内容...

      它甚至不是 getPost/getQuery 验证任何东西的地方,它的工作是为你提供你不想要的数据,从那里发生的事情不应该是它的关注点。

      【讨论】:

        【解决方案4】:
        $dataGet  = $this->getRequest()->getParam('id',null);
        $valid = new Zend_Validate_Digits();
        
        if( isset($dataGet) && $valid->isValid($dataGet) ){
         // do some...
        } else{
          // not set
        }
        

        【讨论】:

          【解决方案5】:

          我一直使用更多的 phpish $this->_request->getPost('this')$this->_request->getQuery('that')(这个用 getquery 而不是 getGet 不太合乎逻辑)。

          这两者中什么是最好的? (或者如果有其他更好的方法)

          简单解释一下getQuery()的选择。措辞的选择来自它是什么类型的数据,而不是它是如何到达那里的。 GET 和 POST 只是请求方法,携带各种信息,包括在 POST 请求的情况下称为“发布数据”的部分。 GET请求没有这样的块,它携带的任何可变数据都是url查询字符串的一部分(?后面的部分)。

          因此,getPost() 从 POST 请求的发布数据部分获取数据,getQuery() 从 GET 或 POST 请求(以及其他 HTTP 请求方法)的查询字符串中检索数据。

          (请注意,GET 请求不应用于任何可能产生副作用的事情,例如更改数据库行)

          所以,在回答您的第一个问题时,请使用getPost()getQuery() 方法,这样您就可以确定数据源在哪里(如果您不在乎,getParams() 也可以,但是可能包括其他数据)。

          使用这种方法验证 php 输入的最佳做法是什么?

          验证输入的最佳位置是您首先使用它的地方。也就是说,当你从getParams()getPost()getQuery()拉取时。这样,您的数据在您需要的地方始终是正确的,并且如果您将其传递出去,您就知道它是安全的。请记住,如果您将它传递给另一个控制器(或控制器操作),您可能应该在那里再次检查它,以确保安全。如何执行此操作取决于您的应用程序,但仍需要检查。

          【讨论】:

            【解决方案6】:

            与主题没有直接关系,但 为了确保您在输入中得到一个数字,也可以使用 $var+0 (但是,如果 $var 是浮点数,它会保持浮点数) 您可以在大多数情况下使用 $id = $this->_request->getQuery('id')+0;

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-07-11
              • 2011-10-13
              • 1970-01-01
              • 2012-08-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多