Php 使用Zend框架处理输入(Post、get等)
我在zend代码上重新分解php,所有代码都充满了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框架文档中读到,您必须验证您自己的输入,因为请求对象不会这样做 这给我留下了两个问题: 这两个
$\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
}