Zend Frameworkによる入力の処理(Post、getなど)
-
19-08-2019 - |
質問
zendコードのphpをリファクタリングし、すべてのコードは$_GET["this"]
と$_POST["that"]
でいっぱいです。私はいつもよりPHPっぽい$this->_request->getPost('this')
と$this->_request->getQuery('that')
を使用しました(これはgetGetの代わりにgetqueryとあまり論理的ではありません)。
だから私は私の方法がより安全/より良い/手入れが簡単かどうか疑問に思っていました。 Zend Frameworkのドキュメントで、リクエストオブジェクトがそれを実行しないため、独自の入力を検証する必要があることを読みました。
2つの質問が残ります:
- この2つの利点は何ですか? (または別のより良い方法がある場合)
- このメソッドでphp入力を検証するためのベストプラクティスは何ですか?
ありがとう!
解決
通常は$ this-<!> gt; _request-<!> gt; 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);
他のヒント
ブライアンの答えを拡張する。
お気付きのとおり、$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);
を使用してコンテンツをエスケープします。
データの取得/投稿用の万能検証関数は作成できません。場合によっては、フィールドが整数であり、他の場合は日付であることが必要です。そのため、zendフレームワークには入力検証がありません。
必要な場所で検証コードを記述する必要があります。もちろん、いくつかのヘルパーメソッドを書くことはできますが、getPost()が自分で何かを検証することを期待することはできません...
そして、何でも検証するgetPost / getQueryの場所でさえありません。あなたがしたくないデータを取得することが仕事です。
$dataGet = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();
if( isset($dataGet) && $valid->isValid($dataGet) ){
// do some...
} else{
// not set
}
私は常により多くのphpish
$this->_request->getPost('this')
および$this->_request->getQuery('that')
を使用しました(これはgetGetの代わりにgetqueryとあまり論理的ではありません)。この2つの利点は何ですか? (または別のより良い方法がある場合)
getQuery()
の選択に関する簡単な説明。言葉遣いの選択は、それがどのようにそこにたどり着いたかではなく、どのようなデータであるかによって決まります。 GETおよびPOSTは単なるリクエストメソッドであり、POSTリクエストの場合は<!> quot; post data <!> quot;として知られるセクションを含む、あらゆる種類の情報を伝達します。 GETリクエストにはそのようなブロックはありません。それが運ぶ変数データは、URLのクエリ文字列の一部(?の後の部分)です。
したがって、getPost()
はPOSTリクエストのポストデータセクションからデータを取得し、getParams()
はGETまたはPOSTリクエスト(および他のHTTPリクエストメソッド)のクエリ文字列からデータを取得します。
(DB行の変更など、副作用を引き起こす可能性のあるものにはGETリクエストを使用しないでください)
したがって、最初の質問への回答では、この方法で<=>および<=>メソッドを使用して、データソースの場所を確認できます(気にしない場合、<=>も機能しますが、追加データを含めることができます)。
このメソッドでphp入力を検証するためのベストプラクティスは何ですか?
入力を検証するのに最適な場所は、最初に使用する場所です 。つまり、<=>、<=>、または<=>からプルするときです。このようにして、データは必要な場所で常に正確であり、データを渡すと安全であることがわかります。別のコントローラー(またはコントローラーアクション)に渡す場合は、念のためもう一度確認してください。これを行う方法はアプリケーションによって異なりますが、確認する必要があります。
トピックに直接関連していませんが、 入力で数値を取得するために、$ var + 0を使用することもできます (ただし、$ varがfloatの場合、floatのままです) ほとんどの場合に使用できます $ id = $ this-<!> gt; _request-<!> gt; getQuery( 'id') +0 ;