[PHP]filter_input関数の完全ガイド!安全な入力値の取得方法

PHP

こんにちは!今回はPHPのfilter_input関数について、基本から実践的な使い方まで詳しく解説していきます。

1. filter_input関数の基本

構文

mixed filter_input ( int $type , string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options ]] )

パラメータ

  • $type: 入力タイプ(INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV)
  • $variable_name: 取得する変数名
  • $filter: 適用するフィルター
  • $options: フィルターのオプション

2. 基本的な使用例

GETパラメータの取得

// 整数値の取得
$user_id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);

// メールアドレスの取得
$email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL);

// URLの取得
$website = filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL);

POSTデータの取得

// 文字列の取得とサニタイズ
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

// 複数のチェックボックスの取得
$options = filter_input(
    INPUT_POST,
    'options',
    FILTER_SANITIZE_STRING,
    FILTER_REQUIRE_ARRAY
);

3. 実践的な使用例

フォームデータの検証

function validateFormData() {
    $data = [
        'username' => filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING),
        'email' => filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL),
        'age' => filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
            'options' => [
                'min_range' => 18,
                'max_range' => 150
            ]
        ]),
        'website' => filter_input(INPUT_POST, 'website', FILTER_VALIDATE_URL)
    ];

    $errors = [];

    foreach ($data as $field => $value) {
        if ($value === false || $value === null) {
            $errors[$field] = "{$field}の値が無効です";
        }
    }

    return [
        'data' => $data,
        'errors' => $errors,
        'is_valid' => empty($errors)
    ];
}

APIパラメータの検証

function validateApiParameters() {
    $params = [
        'api_key' => filter_input(INPUT_GET, 'api_key', FILTER_SANITIZE_STRING),
        'limit' => filter_input(INPUT_GET, 'limit', FILTER_VALIDATE_INT, [
            'options' => ['min_range' => 1, 'max_range' => 100]
        ]),
        'offset' => filter_input(INPUT_GET, 'offset', FILTER_VALIDATE_INT, [
            'options' => ['min_range' => 0]
        ]),
        'sort' => filter_input(INPUT_GET, 'sort', FILTER_SANITIZE_STRING)
    ];

    return array_filter($params, function($value) {
        return $value !== false && $value !== null;
    });
}

4. 高度な使用例

カスタムバリデーションクラス

class InputValidator {
    private $errors = [];

    public function validateInput($type, $field, $filter, $options = null) {
        $value = filter_input($type, $field, $filter, $options);

        if ($value === false || $value === null) {
            $this->errors[$field] = "Invalid {$field}";
            return null;
        }

        return $value;
    }

    public function validateForm() {
        $data = [];

        // ユーザー名(必須)
        $data['username'] = $this->validateInput(
            INPUT_POST,
            'username',
            FILTER_SANITIZE_STRING
        );

        // メールアドレス(必須)
        $data['email'] = $this->validateInput(
            INPUT_POST,
            'email',
            FILTER_VALIDATE_EMAIL
        );

        // 年齢(オプション)
        $data['age'] = $this->validateInput(
            INPUT_POST,
            'age',
            FILTER_VALIDATE_INT,
            ['options' => ['min_range' => 0, 'max_range' => 150]]
        );

        return [
            'data' => $data,
            'errors' => $this->errors,
            'is_valid' => empty($this->errors)
        ];
    }
}

5. セキュリティ対策

XSS対策

function getSecureInput($type, $field) {
    return filter_input(
        $type,
        $field,
        FILTER_SANITIZE_STRING,
        FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_FLAG_STRIP_LOW
    );
}

SQLインジェクション対策

function getDatabaseSafeInput($type, $field) {
    $value = filter_input($type, $field, FILTER_SANITIZE_STRING);
    return $value !== null ? addslashes($value) : null;
}

6. エラーハンドリング

function safeGetInput($type, $field, $filter = FILTER_DEFAULT, $options = null) {
    try {
        $value = filter_input($type, $field, $filter, $options);

        if ($value === false) {
            throw new Exception("バリデーションエラー: {$field}");
        }

        if ($value === null && filter_has_var($type, $field)) {
            throw new Exception("フィルタリングエラー: {$field}");
        }

        return [
            'success' => true,
            'value' => $value
        ];

    } catch (Exception $e) {
        error_log($e->getMessage());
        return [
            'success' => false,
            'error' => $e->getMessage()
        ];
    }
}

まとめ

filter_input関数の主なポイント:

  1. 入力値の検証とサニタイズを同時に行える
  2. 様々なフィルターとオプションが利用可能
  3. セキュリティ対策の基本として重要
  4. エラーハンドリングが必要
  5. パフォーマンスを考慮した実装が可能

注意点:

  • nullとfalseの戻り値の違いを理解する
  • 適切なフィルターとオプションを選択する
  • セキュリティは多層的に実装する

ご質問やご不明な点がありましたら、お気軽にコメントください!

タイトルとURLをコピーしました