23

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

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

这给我留下了两个问题:

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

谢谢!

4

6 回答 6

34

我通常使用 $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);
于 2009-01-19T16:59:25.443 回答
10

扩展布赖恩的答案。

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

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

例如:

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

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

于 2009-01-21T18:58:43.547 回答
6

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

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

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

于 2009-01-19T16:59:28.720 回答
2
$dataGet  = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();

if( isset($dataGet) && $valid->isValid($dataGet) ){
 // do some...
} else{
  // not set
}
于 2012-11-20T22:19:06.490 回答
1

我一直使用更多的 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()andgetQuery()方法,这样,您可以确定数据源在哪里(如果您不关心,getParams()也可以使用,但可能包含其他数据)。

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

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

于 2009-01-24T04:22:06.640 回答
1

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

于 2009-05-19T16:00:48.923 回答