23

zendコードでphpをリファクタリングすると、すべてのコードがとでいっぱいに$_GET["this"]なり$_POST["that"]ます。私はいつもより多くのphpish$this->_request->getPost('this')を使用してきました$this->_request->getQuery('that')(これはgetGetの代わりにgetqueryではそれほど論理的ではありません)。

だから私は自分の方法がより安全/より良い/より簡単に維持できるかどうか疑問に思いました。Zend Frameworkのドキュメントで、リクエストオブジェクトは入力を検証しないため、自分の入力を検証する必要があることを読みました。

それは私に2つの質問を残します:

  • この2つの中で最高のものは何ですか?(または別のより良い方法がある場合)
  • このメソッドで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');

他の値については、より複雑になるため、たとえば、DBクエリ(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

トピックとは直接関係ありませんが、入力で確実に数値を取得するには、$var+0 を使用することもできます (ただし、$var が float の場合は float のままです)。ほとんどの場合、$id = $ を使用できます。 this->_request->getQuery('id') +0 ;

于 2009-05-19T16:00:48.923 に答える
1

私は常に、よりphpish $this->_request->getPost('this')andを使用してきました$this->_request->getQuery('that')(これは、getGetの代わりにgetqueryを使用するとあまり論理的ではありません)。

この2つの中で何が良いですか?(または別のより良い方法がある場合)

の選択について簡単に説明しgetQuery()ます。言葉遣いの選択は、データがどのように得られたかではなく、どのようなデータであるかによって決まります。GET と POST は単なるリクエスト メソッドであり、POST リクエストの場合は「投稿データ」と呼ばれるセクションを含む、あらゆる種類の情報を運びます。GET リクエストにはそのようなブロックはありません。GET リクエストが運ぶ変数データは、URL のクエリ文字列の一部です (? の後の部分)。

したがって、getPost()POST リクエストのポスト データ セクションからgetQuery()データを取得する一方で、GET または POST リクエスト (および他の HTTP リクエスト メソッド) のクエリ文字列からデータを取得します。

(GET リクエストは、DB 行の変更など、副作用を引き起こす可能性のあるものには使用しないでください)

したがって、最初の質問への回答として、メソッドgetPost()getQuery()メソッドを使用すると、データ ソースの場所を確認できます (気にしなくてgetParams()も機能しますが、追加のデータが含まれる場合があります)。

このメソッドでphp入力を検証するためのベストプラクティスは何ですか?

入力を検証するのに最適な場所は、最初に使用する場所です。つまりgetParams()、 、getPost()、またはから引っ張るとgetQuery()。このようにして、データは常に必要な場所に正確に保存され、データを渡しても安全であることがわかります。別のコントローラー (またはコントローラー アクション) に渡す場合は、念のために再度確認する必要があることに注意してください。これを行う方法はアプリケーションによって異なりますが、それでも確認する必要があります。

于 2009-01-24T04:22:06.640 に答える