Php 使用Zend框架处理输入(Post、get等)

Php 使用Zend框架处理输入(Post、get等),php,zend-framework,post,input,get,Php,Zend Framework,Post,Input,Get,我在zend代码上重新分解php,所有代码都充满了$\u GET[“this”]和$\u POST[“that”]。我总是使用更phpish的$this->\u request->getPost('this')和$this->\u request->getQuery('that')(这一个在getQuery而不是getGet时逻辑性不强) 所以我想知道我的方法是否更安全/更好/更容易掌握。我在Zend框架文档中读到,您必须验证您自己的输入,因为请求对象不会这样做 这给我留下了两个问题: 这两个

我在zend代码上重新分解php,所有代码都充满了
$\u GET[“this”]
$\u POST[“that”]
。我总是使用更phpish的
$this->\u request->getPost('this')
$this->\u request->getQuery('that')
(这一个在getQuery而不是getGet时逻辑性不强)

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

这给我留下了两个问题:

  • 这两个最好的是什么?(或者如果有其他更好的方法)
  • 使用此方法验证php输入的最佳实践是什么

谢谢

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

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

$data = $this->_request->getParams();

$validators = array(
    'month'   => 'Digits',
);

$input = new Zend_Filter_Input($filters, $validators, $data);

不能为get/post数据编写一刀切的验证函数。在某些情况下,您要求字段为整数,在其他情况下,例如日期。这就是为什么zend框架中没有输入验证

您必须在需要的地方编写验证代码。当然,您可以编写一些helper方法,但是您不能期望getPost()自己为您验证某些东西


甚至getPost/getQuery都不是验证任何东西的地方,它的工作是为您获取您不想要的数据,从那以后它会发生什么不应该是它的问题。

扩展Brian的答案

正如您所指出的,您还可以签出
$this->\u请求->getPost()
$this->\u请求->getQuery()
。如果对
getParams()
进行概括,这有点像使用
$\u请求
superglobal,我认为这在安全性方面是不可接受的

除了Zend_过滤器之外,您还可以使用简单的PHP来强制转换所需的

例如:

$id = (int) $this->_request->getQuery('id');
对于其他值,它会变得更复杂,因此请确保在DB查询中引用(,请参阅引用标识符,
$DB->quoteIdentifier()
),并在视图中使用
$this->escape($var)以转义内容

我总是使用更phpish的
$this->\u request->getPost('this')
$this->\u request->getQuery('that')
(这一个在getQuery而不是getGet时逻辑性不强)

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

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

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

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

因此,在回答第一个问题时,请使用
getPost()
getQuery()
方法,这样您就可以确定数据源的位置(如果您不介意,
getParams()
也可以工作,但可能包括其他数据)

使用此方法验证php输入的最佳实践是什么


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

与主题没有直接关系,但 为了确保在输入中获得一个数字,还可以使用$var+0 (但是,如果$var是浮动的,则保持浮动) 在大多数情况下,您可以使用
$id=$this->\u请求->获取查询('id')+0

我同意这一点,并建议您也查看Zend表单,因为您可以将过滤器和验证器附加到表单,然后使用该表单对象验证所有传入的输入。不管它是一个表单对象,它还是一个过滤器/验证器容器。
$dataGet  = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();

if( isset($dataGet) && $valid->isValid($dataGet) ){
 // do some...
} else{
  // not set
}