0

PHPでリクエストをサニタイズするための最良の方法を見つけようとしています。

私が読んだことから、GET変数は、「リクエストフロー」の開始時ではなく、表示されているときにのみサニタイズする必要があることがわかりました。変数(データベースからのものではない)も投稿します。

私はここでいくつかの問題を見ることができます:

もちろん、これらの変数をサニタイズする関数を作成することもできます。のようなものを呼び出すことClass::post('name')で、またはClass::get('name')すべてが安全になります。しかし、将来私のコードを使用する人がそれを忘れて$_POST['name'、私の関数の代わりにカジュアル]を使用するとしたらどうでしょうか。ここで提供できますか、それとも少しセキュリティを提供する必要がありますか?

4

4 に答える 4

3

万能のサニタイズはありません。「サニタイズ」とは、特定のプロパティに適合するように値を操作することを意味します。たとえば、数値であるはずのものを数値にキャストします。または<script>、想定される HTML からタグを削除します。何をどのように正確にサニタイズするかは、想定される値とサニタイズする必要があるかどうかによって異なります。たとえば、ホワイトリストに登録されたタグの HTML のサニタイズは非常に複雑です。

Class::sanitizeしたがって、一度にすべてに合う魔法はありません。あなたのコードを使用する人は、とにかく何をしようとしているのかを考える必要があります。やみくもに$_POST値をそのまま使用する場合は、すでに失敗しており、プログラマー カードを提出する必要があります。

常に行う必要があるのは、コンテキストに基づいてエスケープすることです。ただし、それはコンテキストに依存するため、必要な場合にのみ実行します。何のためにエスケープしているのかわからないため、盲目的にすべての$_POST値をエスケープすることはありません。トピック全体の背景情報については、The Great Escapism (または、テキスト内のテキストを操作するために知っておくべきこと) を参照してください

于 2012-11-02T15:03:01.343 に答える
0

$_POST 配列を、配列のように動作するサニタイザー オブジェクトに置き換えます。

于 2012-11-02T15:01:08.493 に答える
0

変数は基本的に、PHP が読み取るときに「サニタイズ」されます。提出する場合の意味

"; exec("some evil command"); $blah="

そうすれば、PHP に関する限り問題にはなりません。そのリテラル文字列を取得できます。

ただし、PHP から別のものに渡す場合は、「別のもの」が文字列を誤って解釈しないようにすることが重要です。そのため、MySQL データベースに入力する場合は、MySQL ルールに従ってエスケープする必要があります (または、これを実行する準備済みステートメントを使用します)。HTML に変換する場合は、最低限エンコード<する必要があります。&lt;JavaScript に入れる場合は、JSON エンコードする必要があります。

于 2012-11-02T15:00:07.040 に答える
0

このようなことができます...絶対確実ではありませんが、動作します..

foreach($_POST as $key => $val)
{
  //do sanitization
  $val = Class::sanitize($val);

  $_POST[$key] = $val;
}

編集:これをできる限りヘッダーの近くに配置する必要があります。私は通常、私のものをコントローラーに入れて、__construct()自動的に実行されるようにします。

于 2012-11-02T15:00:31.243 に答える