2010-12-02 12 views
2

強く型付けされたように、あなたのPHPの入力変数を強制することは可能ですが、私はPHPが緩く型付けされた、それは学ぶためにどのように簡単だったかと本当に幸せでした。しかし、私が成長するにつれて、ゆるやかにタイプされているのは実際にスクリプトを複雑にするのではなく、スクリプトを複雑にすることに気付きました。そして今、私は強い私のPHP変数は、具体的に入力変数($_POST$_GET$_COOKIE$_REQUESTといくつかの$_SERVER VARS)を入力することができます方法を探しています。はそれが

また、SQLインジェクションやその他のエラーが発生しやすい検証プロセスの多くを「忘れる」ように、このプロセスでは検証とサニタイズを隠すことを願っています。私はこれをどのようにしたいかについての大まかなスケッチを持っています。

まず変数を宣言します。好ましくはOOP

$varClass->post->variable_name->type('STR', 'SQL', 'EMAIL'); 

// or as an array 
$_MY_POST['variable_name'] = array('STR', 'SQL', 'EMIAIL'); 

に今私はおそらくちょうど事前に定義されたPHPのグローバルからのすべての宣言されていない変数を削除し、グローバルな配列で直接それらを検証し、サニタイズする変数の型を使用することができます。
また、emaillのような未検証変数の値をfalseに設定し、nullに設定してデータ検証中に使用することもできます。しかし、私はオフに行って、私は期待していた再発明した車の前に:

いくつかのいずれかは、すでに私の問題を解決するのに役立ちますライブラリを私に指示される場合がありますか?
私はこの野生の幻想を追求すべきではない理由があれば、 これを達成するためのより良い、より明確な方法は?
など、このアイデアについて他の一般的な考えがありますか?

+1

ああ、こんにちは、私は強くPHPでタイピングをしたいと思っています。私たちはすぐにプリミティブの型ヒントを得ていると思います。これは間違いなくプラスになります。 –

+0

さらに最後のコメントにスカラー型のヒントがあり、PHPで来るhttp://sebastian-bergmann.de/archives/900-Scalar-Type-Hints-in-PHP-5.3.99.html#content –

+0

実際のところ、あなたがやろうとしていることを実行する実装があります:http://sourceforge.net/p/php7framework/wiki/input/ – mario

答えて

4

http://sourceforge.net/p/php7framework/wiki/input/

デフォルトあたりのスーパーグローバルをラップしますが、$postFilter = new input($_POST)でローカルオブジェクトをインスタンス化できます。次のように手動で使用されることになっています:

$_POST->email->sql["variable_name"] 
$_POST->array->int["order_list"] 

そして、それはどの$ _POST [「生」]アクセスを見れば、それは文句を言います。

ただし、フィルタリストを事前定義することもできます。私はそれをクラス定義で集中的に行います。

var $__rules = array(
     "variable_name" => "email,sql", 
     "order_id" => "int,range:0:500", 
     "order_list" => "array,int", 
); 

しかし、私は個人的には避けるだろう - > SQLを:これはアドオンを手動でコードを通過し、データ形式や種類を強制する文字列を書き換えたくない古いアプリケーションのためであると考えられます早まってエスケープする。使用可能な場合は、PDOおよびパラメータ化されたSQLを使用する必要があります。しかし、もちろん、中心的なエスケープ機能は、それほど優れた機能ではありません。

カスタムフィルタを定義することもできます。たとえば、グローバル関数を取り上げます。

+1

私は、パラメータ化されたSQLとPDOの使用を2番目にしたいと思います。それはあなたの人生を簡単にします。 – cwallenpoole

0

私はかなりの程度までこれを行い我々のアプリのためのフォームシステムを書かれています。

  • 私はナンスがフォームを確保し、またにするために使用されているすべての私は期待していフィールドとそれらについての規則(データ型、最小ではなく、分、最大値、列挙型など)
  • を定義しますそれは、次に、既知の各フィールドをチェック送信されたデータを取得し、それを検証
    • もしそうなら、それが適切なノンスが送信されたかどうかを確認する
    • セッションが回復され、各直列化形式の確認を送信し、自身が送信考えると判断
    • すべてのフィールドをリセットできますその彼らがこれも同様に、クライアント側の検証ルールのフォームや世代のレンダリングを処理しますので、私は一度だけ(サーバ側)のルールを記述することができ、無効な

している場合、デフォルトとの両方のクライアントとのサーバー側の検証が自動的に行われます。データ型ルールは、各フィールドに対して定義する必要がある最小値です。

残念ながら、それはオープンソースではなく、ソースを開く権限がありません。私はこのようなものを見つけるために長い時間を探しましたが、実際には何も見つかりませんでした。 Pear Quickformsライブラリは一番近いものでしたが、検証のすべてをカバーしていないようで、ひどい恐ろしい文書がありました。

+0

それは私が探しているもののほとんどのように実際には聞こえます。 PHPで利用可能な少数のデータ検証とサニタイズライブラリは、安全でないアプリケーションを包むために有名なことを本当に考慮すると残念です。実際にPHPにfilter_var()関数を実際に組み込むためには5つのバージョンが必要でした。 – shxfee

4

PHPは緩く

んを入力しなかった - そのルーズではない、それは動的がタイプだ - 微妙な違いがあります。

は実際に私の経験は全く逆である彼らに

を簡素化するというし、私のスクリプトが複雑。

私は強い型付けは、特に(緩く型付けされた)HTTPなどの媒体を介して、入力検証を処理する方法ではありません

...私の検証と消毒をしたいと思います。可能なすべての入力に対してタイプ検証を行うことは実用的ではありません。文字列に電子メールアドレスを格納できるのは確かですが、電子メールアドレスが正しくフォーマットされているわけではありません。強力なタイピングは、開始日が終了日より前であることをどのようにして保証しますか?

PHPの最近のバージョンはfilter functionalityですが、私は(私が知っているほとんどの人が)自分の入力検証ライブラリを使っていますが、2次検証(2つ以上の入力の相対値を比較)コード。入力のタイプを変更する必要があるのは、結果としてデータが失われない場合です(例:文字列から数値への変換 - ただし結果としてデータが失われていないことが必要です)。入力varの予想される型を宣言することは、変数の実際の型を宣言することよりも難しくありません。処理に適した入力の有効な表現を作成できない場合、コードはユーザーの意図を決して推測するべきではありません。入力を拒否し、ユーザー/呼び出しプロシージャに通知する必要があります。

非常に多くの検証は非常に文脈上のものです。英国の02/12/2010は、米国で同じ日付から10ヶ月後です。

あなたは本当にPHPは、そのが強く型付けされたかのように振る舞うようにしたい場合は、私はSQLインジェクションについては「忘れる」ことができるように、NO

PHPLint

を見て!入力を検証/サニタイズし、出力先に応じて出力を変換します。HTMLに書き込むための文字列の正しい表現は、それをデータベースに書き込むのとは異なるURLに書き込むこととは異なります。

+0

質問を正しく読んでもよろしいですか?そうでない場合は、出力を変換する最後のポイントになります。前に言及したように、$ _POST、$ _GET、および他の入力固有のグローバル変数を扱うことについての質問で繰り返されたように、私は入力部分の検証/サニタイズを心配しています。出力ではありません。あなたは私の貧しい質問のタイトルと私の記述的スキルのために私を嘲笑しているかもしれません。私の質問の文脈を得るために@marioの答えを見てください。 – shxfee