【PHP8.x】filter_input_array関数の使い方

作成日: 更新日:

filter_input_array関数は、GETやPOSTといった外部からの入力を複数まとめて取得し、それぞれに指定したフィルタを適用する処理を実行する関数です。この関数は、ウェブのフォームから送信された複数のデータを一度に検証し、安全な形式に変換(サニタイズ)する際に特に役立ちます。個々の入力値に対してfilter_input関数を繰り返し呼び出す代わりに、この関数を使うことでコードをより簡潔かつ効率的に記述できます。第一引数には、データの取得元となる入力タイプをINPUT_GETINPUT_POSTなどの定数で指定します。第二引数には、フィルタの定義を連想配列で渡します。この配列のキーは取得したい入力データのキー名、値は適用するフィルタの種類やオプションを指定する構成となります。これにより、各入力項目に対して異なる検証ルールを一度に設定することが可能です。処理が完了すると、フィルタリングされた値を含む連想配列が返されます。フィルタリングに失敗したキーの値はfalseとなり、指定した入力タイプ自体が存在しない場合はnullが返されます。

基本的な使い方

構文(syntax)

filter_input_array(int $type, array|int|null $options = null, bool $add_empty = true): array|false|null

引数(parameters)

int $type, array|int|null $options = null, bool $add_empty = true

  • int $type: 取得する入力の種類を指定します。例えば、INPUT_GET(GETメソッドで送信されたデータ)、INPUT_POST(POSTメソッドで送信されたデータ)など。
  • array|int|null $options = null: フィルタリングのオプションを指定します。配列で複数のフィルタを指定したり、特定のフィルタIDを指定したりできます。デフォルトはnullで、フィルタリングは行われません。
  • bool $add_empty = true: フィルタリング結果として空の項目を含めるかどうかを指定します。true(デフォルト)の場合は含め、falseの場合は含めません。

戻り値(return)

array|false|null

成功時には、指定されたフィルタリングオプションに基づいて処理された入力データの連想配列を返します。フィルタリングに失敗した、または該当する入力が存在しない場合は false を、指定された $typeINPUT_SESSION で、かつセッションが開始されていない場合は null を返します。

サンプルコード

PHPでPOSTデータの一括検証・サニタイズ

<?php

/**
 * POSTリクエストで送信されたデータを処理し、結果を表示する関数。
 * filter_input_array を使用して、入力データを一括で検証・サニタイズします。
 */
function process_user_form(): void
{
    // このスクリプトがPOSTリクエストによって呼び出された場合のみ処理を実行します。
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        return;
    }

    // 各入力フィールドに対するフィルターの定義を配列で用意します。
    $filters = [
        // 'name' フィールド: 特殊文字をHTMLエンティティに変換して無害化(サニタイズ)します。
        'name' => FILTER_SANITIZE_SPECIAL_CHARS,
        // 'email' フィールド: 有効なメールアドレス形式か検証します。
        'email' => FILTER_VALIDATE_EMAIL,
        // 'age' フィールド: 整数か検証し、さらにオプションで範囲を指定します。
        'age' => [
            'filter' => FILTER_VALIDATE_INT,
            'options' => [
                'min_range' => 18, // 許容する最小値
                'max_range' => 100 // 許容する最大値
            ]
        ],
        // 'agree' フィールド: 'on', '1', 'yes', 'true' などをブール値の true に変換します。
        // チェックが入っていない場合は null になります。
        'agree' => FILTER_VALIDATE_BOOLEAN,
    ];

    // filter_input_array を使用して、$_POST データを一括で検証・サニタイズします。
    // 第1引数に INPUT_POST を指定することで、$_POST スーパーグローバル変数が処理対象になります。
    $processed_data = filter_input_array(INPUT_POST, $filters);

    // 処理結果を画面に出力します。
    // 検証に失敗した項目は false に、存在しない項目は null になります。
    echo '<h2>処理結果</h2>';
    echo '<p><code>filter_input_array(INPUT_POST, ...)</code> の実行結果:</p>';
    echo '<pre>';
    var_dump($processed_data);
    echo '</pre>';
}

// 関数の実行
process_user_form();

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>filter_input_array サンプル (POST)</title>
    <style>
        body { font-family: sans-serif; line-height: 1.6; padding: 20px; }
        form div { margin-bottom: 10px; }
        label { display: inline-block; width: 150px; }
        input[type="text"], input[type="number"] { width: 200px; }
        button { padding: 5px 15px; }
        h2 { border-bottom: 1px solid #ccc; padding-bottom: 5px; }
        pre { background-color: #f4f4f4; border: 1px solid #ddd; padding: 10px; }
    </style>
</head>
<body>
    <h1>ユーザー情報入力フォーム</h1>
    <p>このフォームのデータをPOSTメソッドで送信し、PHP側で検証・サニタイズします。</p>
    <form action="" method="post">
        <div>
            <label for="name">名前:</label>
            <input type="text" id="name" name="name" value="<script>alert('XSS');</script>">
        </div>
        <div>
            <label for="email">メールアドレス:</label>
            <input type="text" id="email" name="email" value="invalid-email@">
        </div>
        <div>
            <label for="age">年齢:</label>
            <input type="number" id="age" name="age" value="25">
        </div>
        <div>
            <label for="agree">利用規約に同意:</label>
            <input type="checkbox" id="agree" name="agree" value="on" checked>
        </div>
        <button type="submit">送信</button>
    </form>
</body>
</html>

filter_input_array関数は、フォームから送信されたデータなど、外部からの複数の入力値を一度にまとめて検証(バリデーション)および無害化(サニタイズ)するために使用します。

このサンプルコードは、HTMLフォームからPOSTメソッドで送信されたユーザー情報を一括で処理する例です。

関数の第1引数には、処理対象の入力タイプを指定します。ここではINPUT_POSTを指定しているため、$_POSTスーパーグローバル変数が処理対象となります。第2引数には、各入力フィールド名('name'や'email'など)をキーとし、適用したいフィルタールールを値とする連想配列を渡します。これにより、例えば'name'フィールドは特殊文字を無害化し、'email'フィールドは有効なメールアドレス形式かどうかが検証されます。'age'のように、フィルターに加えて'options'キーで詳細な条件(数値の範囲など)を指定することも可能です。

戻り値は、フィルター処理後のデータが格納された配列です。検証に成功した値はそのまま、検証に失敗した値はfalse、フォームで送信されなかった値はnullとして配列に格納されます。エラーが発生した場合はfalseが返ります。この関数を使うことで、入力値を安全かつ効率的に扱うことができます。

filter_input_array関数は、フォームからの複数の入力を一度に検証・無害化できる便利な機能です。注意点として、検証に失敗した項目はfalse、入力自体が存在しない項目はnullが結果の配列に格納されます。このfalsenullの違いを厳密に判定し、エラー処理を適切に行うことが重要です。また、フィルターには形式を検証するFILTER_VALIDATE_*と、危険な文字を無害化するFILTER_SANITIZE_*があり、入力項目と目的に合わせて正しく選択する必要があります。この関数は基本的なチェックに役立ちますが、データベースの重複チェックなど、より複雑な条件の検証は別途実装する必要があります。

PHP: filter_input_arrayで多次元配列を処理する

<?php

declare(strict_types=1);

/**
 * filter_input_array を使用して多次元配列のPOSTデータを検証・無害化します。
 *
 * このサンプルは、ユーザー情報のようなネストされた配列構造を持つフォームからの入力を
 * 安全に処理する方法を示します。
 *
 * @return void
 */
function processMultidimensionalPostData(): void
{
    // このサンプルを単体で動作させるため、$_POST 変数を擬似的に設定します。
    // 実際のWebアプリケーションでは、HTMLフォームからのPOSTリクエストによってこの変数が設定されます。
    $_POST = [
        'user' => [
            'name' => '<Taro Yamada>', // サニタイズ対象のデータ
            'email' => 'taro.yamada@example.com', // 有効なデータ
            'age' => '25', // 検証対象のデータ (文字列)
            'options' => [
                'newsletter' => '1',
                'privacy_policy' => 'on' // フィルタ定義にないため、結果から除外される
            ]
        ],
        'csrf_token' => 'a1b2c3d4-e5f6-7890-a1b2-c3d4e5f67890',
        'invalid_email' => 'invalid-email-format', // 無効なデータ
    ];

    // 多次元配列に対応するフィルタリングの定義を作成します。
    $definition = [
        'user' => [
            // 'user' キーの値が配列であることを要求します。
            'filter' => FILTER_DEFAULT,
            'flags'  => FILTER_REQUIRE_ARRAY,
            'options' => [
                // 'user[name]' を特殊文字をエスケープして無害化(サニタイズ)します。
                'name' => FILTER_SANITIZE_SPECIAL_CHARS,
                // 'user[email]' をメールアドレス形式として検証(バリデーション)します。
                'email' => FILTER_VALIDATE_EMAIL,
                // 'user[age]' を整数として検証し、18歳以上という条件を追加します。
                'age' => [
                    'filter' => FILTER_VALIDATE_INT,
                    'options' => ['min_range' => 18]
                ],
                // 'user[options]' も配列であることを要求します。
                'options' => [
                    'filter' => FILTER_DEFAULT,
                    'flags'  => FILTER_REQUIRE_ARRAY,
                    'options' => [
                        // 'user[options][newsletter]' を真偽値として検証します。
                        'newsletter' => FILTER_VALIDATE_BOOL,
                    ]
                ]
            ]
        ],
        'csrf_token' => FILTER_SANITIZE_SPECIAL_CHARS,
        'invalid_email' => FILTER_VALIDATE_EMAIL,
    ];

    // filter_input_array を使って $_POST 全体をフィルタリングします。
    // 第3引数(add_empty)を false にすると、定義にないキーは結果の配列に含まれなくなります。
    $filtered_data = filter_input_array(INPUT_POST, $definition, false);

    // フィルタリング結果を出力します。
    // - サニタイズされた値は、安全な文字列に変換されます。
    // - バリデーションに成功した値は、期待する型(整数、真偽値など)に変換されます。
    // - バリデーションに失敗した値は `false` になります。
    var_dump($filtered_data);
}

// 関数を実行して結果を表示します。
processMultidimensionalPostData();

filter_input_array関数は、フォームから送信されたデータのような外部からの入力を、定義したルールに従ってまとめて検証(バリデーション)および無害化(サニタイズ)するための関数です。このサンプルコードは、ユーザー情報のように入れ子になったデータ構造、つまり多次元配列を安全に処理する方法を示しています。

まず、$definitionという配列で、入力データのキー構造に合わせてフィルタリングのルールを定義します。例えば、FILTER_VALIDATE_EMAILはメールアドレス形式を検証し、FILTER_SANITIZE_SPECIAL_CHARSはHTMLタグなどの特殊文字を無害化します。FILTER_VALIDATE_INTのように、optionsを使って「18歳以上」といった詳細な条件を追加することも可能です。入れ子になった配列を検証するには、flagsFILTER_REQUIRE_ARRAYを指定します。

filter_input_array関数を呼び出す際、第1引数には入力の種類(この例ではINPUT_POST)を、第2引数には作成したルール定義を渡します。第3引数にfalseを指定すると、ルールに定義されていない入力データは結果の配列から除外されます。

関数の戻り値は、フィルタリング処理後のデータが格納された配列です。検証に成功した値は期待されるデータ型(整数や真偽値など)に変換され、検証に失敗した値はfalseになります。入力が存在しない場合はnull、処理自体に失敗した場合はfalseが返されます。

filter_input_arrayを使う際、検証に失敗した項目の値は false になるため注意が必要です。フィルタリング後の値を使う前には、必ず false かどうかを厳密な比較 (===) で確認してください。この関数は、データをルール通りか確認する「検証」と、安全な形に変換する「無害化」の二つの目的で使われます。多次元配列を扱うには、FILTER_REQUIRE_ARRAYフラグを使い、階層に合わせてフィルタを定義します。第3引数を false に設定すると、フィルタ定義にない入力項目は結果から除外され、意図しないデータの混入を防げます。また、検証に成功すると、値は整数や真偽値など、フィルタに応じた型に変換されます。

【PHP8.x】filter_input_array関数の使い方 | いっしー@Webエンジニア