2009-11-27 11 views
10

私は現在、PHPベースのCMSで多くの作業をしていますが、私はそれに取り組んでいますが、ユーザー入力の取り扱いと衛生をすべて1つの中心的な場所に移したいと思います。 (現時点では$ _REQUEST、$ _GETなどがあります)。filter_input()が不完全なのはなぜですか?

私はfilter_input()が大好きで、基本的な衛生管理にこの機能を使用したいと思いますが、この機能が実際に生産可能かどうかは不明です。例えば、documentation名$のための次のパラメータは、関数が5.2.0以降存在

INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV, INPUT_SESSION (not implemented yet) and INPUT_REQUEST (not implemented yet).

を入力し、なぜ2つの重要な要素はまだ実装されていませんか? $ _REQUESTからデータをフェッチしたい場合、ユーザーが投稿したノートの回避策を使用する必要があります。これには特別な理由はありますか?この機能はまだ何らかのベータ版ですか?着信データを処理する最初の呼び出しとしては信頼できるのですか?

多分、PHP開発プロセスに精通している誰かが、これについていくつか光を当てることができます。

+1

と2015年に、まだ$ _SESSION少なくともイムまだ他の人をチェックしていないだけもう一度PHPのボールを拾うための実装はないようです、 filter_varは回避策です。 – Chris

+2

'INPUT_SESSION'と' INPUT_FILES'は実装されていません( '$ _FILES'は多次元のユースケースを表しますが、デフォルトでは他のものとは異なります)。 '$ _SESSION'には' filter_var_array() 'を使います。また、「INPUT_DATABASE」もないことに気付くかもしれませんが、そこには依然として責任があります。ここでも、 'filter_var_array()'を試してみてください。 –

答えて

8

私は次のようになりますどのように素敵な1中心的な場所

はい、すべてにハンドリングし、ユーザ入力の衛生を移動したいと思います。それはできません。テキスト処理の仕方ではありません。

あるコンテキストから別のコンテキストにテキストを挿入する場合は、正しいエスケープを使用する必要があります。 (MySQL文字列リテラルの場合はmysql_real_escape_string、HTMLコンテンツの場合はhtmlspecialchars、URLパラメータの場合はurlencode、特定のコンテキストの場合はその他)。スクリプトの開始時にフィルタリングしているときに、入力がどこで終わるのかわからないので、それをエスケープする方法はわかりません。

1つの入力文字列がデータベースに(SQLエスケープする必要があります)、ページに直接(HTMLエスケープする必要があります)両方向に進んでいる可能性があります。両方のケースをカバーするエスケープはありません。両方のエスケープを順番に使用することができますが、HTMLの値には奇妙なバックスラッシュが表示され、データベースのコピーはアンパサンドでいっぱいになります。この誤った符号化が数回行われ、何かを編集するたびに、\\\\\\\\\\\\\\\\\\\\&という長い文字列が出てくる状況が発生します。

あなたが安全に、開始時に一度にフィルタリングすることができます唯一の方法は、完全にどのあなたがそれらを使用することになるだろう文脈の中でエスケープする必要があるすべての文字を削除することである。しかし、それは何のアポストロフィを意味しませんHTMLのバックスラッシュ、データベースのアンパサンドや小文字の区別がありません。また、おそらくURLの他の邪魔にならない句読点もあります。任意のテキストを取らない単純なサイトでは、おそらくそれを取り除くことができます。しかし、通常はありません。

ある種のテキストが別のテキストに入ると、その場でしかエスケープできません。この問題を回避する最適な方法は、SQL文字列の代わりにパラメータ化されたクエリを使用するなどして、できるだけ多くのテキストを他のコンテキストに連結しないようにすることです。また、echo(htmlspecialchars())ファンクションを素敵な短い名前で定義するか入力する作業が少なくて済み、デフォルトでHTMLエスケープする別のテンプレートシステムを使用する必要があります。

+0

あなたはひどく長い答えを書いています(良い説明ですが)。 –

+0

@bobince:もしあなたが1)あなたがスクリプトで必要とするものを知っていれば、ある程度まで行うことができますし、2)墨塗りされた変数を自分のものとしてマークしてください。私はあなたの話を知るために\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ " :)私の主な目標は、コード全体に渡って配列から要素を取り出すのではなく、定義された一連のチェックで基本的な "セキュリティチェックポイント"を1つ持つことです。 –

+0

簡単な説明は、フィルタリング/サニタイズ処理は、データが通過する必要があるプロセスの一部に過ぎないということです。消毒されたデータは引き続きエスケープする必要があります。例えばどのように有効であっても、SQLクエリーに引用されていない電子メールアドレスを付けることはありません。 –

3

プログラミングでは、できるだけ入力を制限する必要があります。それはデータソースにも役立ちます。 $ _REQUESTには、$ _GET、$ _POST、$ _COOKIEのすべてが含まれているため、問題が発生する可能性があります。

たとえば、CMSのプラグインが、別のプラグインに意味のあるキーとして存在する新しい特殊キーをその1つに導入するとどうなりますか?

$ _REQUESTは使用しないでください。あなたのシナリオに合った$ _GET、$ _POSTまたは$ _COOKIEを使用してください。 できるだけ厳密にするのが良い習慣であり、それはPHPとは関係ありませんが、一般的なプログラミングです。

+1

$ _REQUESTの有効なポイントですが、実装されていないままではなく、そうでなければなりません。 –

関連する問題