web-dev-qa-db-ja.com

Zend Frameworkでの入力の処理(Post、getなど)

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

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

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

  • この2つの最高のものは何ですか? (または別のより良い方法がある場合)
  • このメソッドでphp入力を検証するためのベストプラクティスは何ですか?

ありがとう!

23
DFectuoso

私は通常$ 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);
34
Brian Fisher

ブライアンの答えを拡張します。

お気づきのように、$this->_request->getPost()$this->_request->getQuery()もチェックできます。 getParams()を一般化すると、それは_$_REQUEST_スーパーグローバルを使用するようなものであり、セキュリティの観点からは受け入れられないと思います。

Zend_Filterに加えて、simple PHPを使用して必要なものをキャストすることもできます。

例えば。:

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

他の値の場合、それはより複雑になるので、例えば、 DBクエリでの引用( Zend_Db 、引用識別子、$db->quoteIdentifier()を参照)およびビューでは、$this->escape($var);を使用してコンテンツをエスケープします。

10
Till

Get/postデータの万能検証関数を作成することはできません。たとえば、フィールドを整数にする必要がある場合と、日付にする必要がある場合があります。そのため、zendフレームワークには入力検証がありません。

必要な場所に検証コードを書く必要があります。もちろん、いくつかのヘルパーメソッドを作成することはできますが、getPost()がそれ自体で何かを検証することを期待することはできません...

そして、それは何かを検証するためのgetPost/getQueryの場所でさえありません、それはあなたが望まないデータをあなたに取得することです、それ以降に何が起こるかはそれが問題ではないはずです。

6
Jan Hančič
$dataGet  = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();

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

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

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

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

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

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

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

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

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

1
Kenzal Hunter

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

1
ven