zendコードでphpをリファクタリングすると、すべてのコードが_$_GET["this"]
_と_$_POST["that"]
_でいっぱいになります。私はいつももっとphpish$this->_request->getPost('this')
と$this->_request->getQuery('that')
を使用してきました(これはgetGetの代わりにgetqueryではあまり論理的ではありません)。
だから私は私の方法がより安全/より良い/より簡単に維持できるかどうか疑問に思いました。 Zend Frameworkのドキュメントで、リクエストオブジェクトは入力を検証しないため、独自の入力を検証する必要があることを読みました。
それは私に2つの質問を残します:
ありがとう!
私は通常$ 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);
ブライアンの答えを拡張します。
お気づきのように、$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);
を使用してコンテンツをエスケープします。
Get/postデータの万能検証関数を作成することはできません。たとえば、フィールドを整数にする必要がある場合と、日付にする必要がある場合があります。そのため、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リクエストの場合、「ポストデータ」と呼ばれるセクションを含む、あらゆる種類の情報を伝達します。 。GETリクエストにはそのようなブロックはありません。それが運ぶ変数データは、URLのクエリ文字列の一部です(?の後の部分)。
したがって、getPost()
はPOSTリクエストの投稿データセクションからデータを取得しますが、getQuery()
はGETまたはいずれかのクエリ文字列からデータを取得しますPOSTリクエスト(および他のHTTPリクエストメソッド)。
(DB行の変更など、副作用が発生する可能性のあるものにはGETリクエストを使用しないでください)
したがって、最初の質問に答えるには、getPost()
メソッドとgetQuery()
メソッドを使用します。これにより、データソースの場所を確認できます(気にしない場合は、getParams()
も機能しますが、追加のデータが含まれる場合があります)。
このメソッドでphp入力を検証するためのベストプラクティスは何ですか?
入力を検証するのに最適な場所は、最初それを使用する場所です。つまり、getParams()
、getPost()
、またはgetQuery()
からプルする場合です。このように、データは必要な場所で常に正しいものであり、データを渡すと安全であることがわかります。別のコントローラー(またはコントローラーアクション)に渡す場合は、安全のために、そこでもう一度確認する必要があることに注意してください。これをどのように行うかはアプリケーションによって異なりますが、それでもチェックする必要があります。
トピックに直接関係していませんが、入力で数値を確実に取得するために、$ var + 0を使用することもできます(ただし、$ varがfloatの場合は、floatのままです)。ほとんどの場合、$ id = $を使用できます。 this-> _ request-> getQuery( 'id')+;