こんにちは!今回は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関数の主なポイント:
- 入力値の検証とサニタイズを同時に行える
- 様々なフィルターとオプションが利用可能
- セキュリティ対策の基本として重要
- エラーハンドリングが必要
- パフォーマンスを考慮した実装が可能
注意点:
- nullとfalseの戻り値の違いを理解する
- 適切なフィルターとオプションを選択する
- セキュリティは多層的に実装する
ご質問やご不明な点がありましたら、お気軽にコメントください!