web-dev-qa-db-ja.com

整数、単語の配列の入力フィルタリング

これは、ここ数年私を悩ませてきたものです-JoomlaはJRequestを提供し、次にJInputが着信リクエストからフィルタリングされたデータにアクセスするために提供しました。フィルタリングされた文字列、整数、単語などを要求できます。または、配列を要求することもできます(変数名のみでgetVarを使用し、返された値が配列であることを想定/確認するか、またはそれにいくつかの追加のパラメーター)。

しかし、整数や単語などの配列を要求することはできません。

何か不足していますか?

たとえば、my POSTデータには以下が含まれる可能性があります。

stuff[abc]=1
stuff[def]=75
stuff[123]=<script src="http://imanaughtysite.com/muahahaha.js"/>

JInputに整数の配列として「もの」を要求するにはどうすればよいですか?

6
John Rix

では、利用可能なオプションを見てみましょう。以下の例はJInputを使用しており、Joomla 3.3でテストされています。

私は次のデータを投稿しています Joomlaで:

stuff[abc]=1
stuff[def]=75
stuff[123]=<script src="http://imanaughtysite.com/muahahaha.js"/>

きれいな整数の配列を取得したい期待される結果は:

$expectedResult = array(
    'abc' => 1,
    'def' => 75,
    '123' => 0,
);

オプション1-ARRAYフィルターを使用したJInput :: get()

$a1 = $app->input->get('stuff', array(), 'ARRAY');

結果:

array (size=3)
  'abc' => string '1' (length=1)
  'def' => string '75' (length=2)
  123 => string '<script src="http://imanaughtysite.com/muahahaha.js"/>' (length=54)

悪い考え-ご覧のように、データを取得していますが、まったくフィルタリング/クリーンアップされていません!

オプション2-ポストのJInput :: getArray()

$a2 = $app->input->post->getArray();

結果:

array (size=1)
  'stuff' => 
    array (size=3)
      'abc' => string '1' (length=1)
      'def' => string '75' (length=2)
      123 => string '' (length=0)

これで、POST配列全体がクリーンアップされました。しかし、これは必要な情報であり、整数の配列ではありません。

オプション3-予想されるパラメーターとそれぞれのフィルターを指定するJInput :: getArray():

$a3 = $app->input->getArray(array(
    'stuff' => array(
        'abc' => 'INT',
        'def' => 'INT',
        '123' => 'INT'
    )
));

結果:

array (size=1)
  'stuff' => 
    array (size=3)
      'abc' => int 1
      'def' => int 75
      123 => int 0

これは実際に必要なものを提供する最初のバージョンです。フィルターを個別に指定して結果を取得できます。 stuffは、結果の配列からPHP関数array_values値だけを抽出して、キーをリセットすることもできます。

オプション4-JInput :: getArray()の改善

オプション3はうまくいくかもしれませんが、いくつかの問題があります。

  • フィールドの名前が事前にわからない場合はどうなりますか?
  • 100以上のフィールドがある場合はどうすればよいですか-それぞれを書きたくない

この問題を解決するには、より多くのステップでそれを行う必要があります。

// Get the data unfiltered
$unfilteredData = $app->input->get('stuff', array(), 'ARRAY');

// Pre-filling all parameters with the INT filter.
$a4 = $app->input->getArray(array(
    'stuff' => array_fill_keys(array_flip($unfilteredData), 'INT')
));

結果は次のとおりです。

array (size=1)
  'stuff' => 
    array (size=4)
      'abc' => int 1
      'def' => int 75
      123 => int 0

キーが必要な場合にセキュリティ上の問題が発生する可能性があります:キーではなく値をフィルタリングしています!

いくつかの簡単な処理:

$finalArray = array_values($a4['stuff']);

array (size=4)
  0 => int 1
  1 => int 75
  2 => int 0

ANSWER IS HERE:-> a POST request(ideally fitこれをメソッドに入れます):

// Get the data unfiltered
$unfilteredData = $app->input->get('stuff', array(), 'ARRAY');

// Check to see if array is empty.
if (! empty($unfilteredData))
{
    $a4 = $app->input->getArray(array(
        'stuff' => array_fill_keys(array_flip($unfilteredData), 'INT')
    ));

    $result = array_values($a4['stuff']);
}
else
{
    $result = array();
}
7
Valentin Despa

Joomlaはフィルターとして複数のタイプをサポートしていません。

これは、JRequestまたはJInputを使用して行うことはできません。

Joomlaで利用できる回避策は今のところありません。コード内でのみ複数のフィルターを処理する必要があります。

7
Nick

あなたは間違いなく何かを見逃していません。これを定期的に行っている場合は、システムプラグインを作成して、既存のJRequestクラスを拡張し、それに新しいフィルタータイプを追加できます。

4
Jeremy Proffitt