質問

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 ;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top