URLのクエリ文字列から値を受け取り、扱う場面はWebアプリ開発で頻繁にあります。パラメータの読み取り方法から、取得できていない時の対応、安全な処理方法までを網羅します。GETパラメータ取得の基礎を押さえ、攻撃対策を含めた現実的な実装例を学ぶことで、信頼性の高いコードが書けるようになります。PHP初心者から中級者まで役立つ内容になっています。
目次
PHP GET パラメータ 取得の基本と仕組み
PHPでGETパラメータを取得するとは、URLの「?key=value」の形式で送られてきた情報をサーバ側で受け取ることを指します。ユーザーがブラウザに入力した情報やリンククリック時の値、ページネーションや検索語などがこれに含まれます。取得にはスーパーグローバル変数である $_GET を使うのが基本です。
$_GET は、リクエストURLのクエリ部分を解析して連想配列として格納されます。指定したキーが存在しない場合は未定義キーとなるため、アクセス前に isset 関数で存在確認することが望ましいです。また、ブラウザがパラメータ値を百分率エンコードして送信するため、関数 urldecode を内部的に適用するなど扱いに注意が必要です。
$_GET の使い方
例えば URL が “page.php?name=Alice&age=30” の場合、PHP では $_GET[‘name’] や $_GET[‘age’] により値を取得できます。キーの一致や大文字小文字の扱いに注意し、期待通りの型(文字列/数値)に変換して使います。未設定のキーを参照すると警告が出るため、isset を使って存在チェックを行うのが安全です。
isset・empty でのチェック
$_GET[‘key’] をそのまま使う前に、isset($_GET[‘key’]) で “キーがあるか”、empty($_GET[‘key’]) で “値が空でないか” をチェックすることが安全性と可読性に寄与します。特にフォームやURLから複数のパラメータを受け取る場合、このチェックを怠ると予期せぬ動作や警告が発生します。
型変換の重要性
GETで受け取る値は基本的に文字列です。しかし数値やブール値として処理したい場合は キャストするか、バリデーション関数を使って型を確認する必要があります。例えば is_numeric や ctype_digit を使って数字かどうかをチェックし、(int) や (float) で変換することで安全に扱えます。
最新情報に基づく安全な取得方法フィルタとバリデーション
外部からの入力データは常に危険の可能性があります。SQLインジェクションやクロスサイトスクリプティング(XSS)などを防ぐためには、取得時にサニタイズおよびバリデーションを行うことが必須です。PHPには filter_input や filter_input_array といった関数があり、これらを積極的に使うことでコードの安全性とメンテナンス性を高められます。
filter_input を使う場合、INPUT_GET を指定して GET パラメータを取得しつつフィルタをかけられます。FILTER_VALIDATE_INT や FILTER_VALIDATE_EMAIL など、形式をチェックするバリデーションフィルタと、FILTER_SANITIZE_FULL_SPECIAL_CHARS など文字列を無害化するサニタイズフィルタがあります。PHP のバージョン更新により FILTER_SANITIZE_STRING が非推奨となったため、適切なフィルタの選定が重要になっています。
filter_input の使い方
filter_input は第1引数に INPUT_GET、第2引数にキー名を取り、第3引数でフィルタタイプ、必要に応じてオプションを指定できます。変数未設定時は null、バリデーション失敗時は false、成功時はフィルタ後の値を返します。これらの返り値を === 演算子で厳密にチェックすることで未設定や不正な値を区別できます。
filter_input_array による複数パラメータ処理
複数の GET パラメータを一括で取得し、それぞれに異なるフィルタを適用したい場合は filter_input_array が便利です。例えば、ID は整数、名前は特殊文字のエスケープ、メールアドレスは形式チェックといったように、配列形式で定義できます。add_empty パラメータで未送信キーを含めるか否かも制御できます。
htmlspecialchars による XSS 対策
ユーザー入力を画面に出力する際には htmlspecialchars を使って 、シングル・ダブルクォートなどを HTML エンティティに変換し、ブラウザ側でタグとして解釈されないようにします。ENT_QUOTES と UTF-8 を指定することで多くの場合に安全性が確保できます。これは filter_input サニタイズだけでは不十分な場合があり、特に出力時のエスケープが不可欠です。
PHP GET パラメータ取得時のセキュリティ考慮点と攻撃対策
GETパラメータによる脆弱性は、外部入力を予期せぬ形で信頼してしまうことから発生します。代表的な攻撃には SQL インジェクション、XSS、ディレクトリトラバーサルなどがあります。これらを防ぐためには、取得だけでなくその後の処理も安全設計が必要です。
SQL に値を直接埋め込むことはやめ、プリペアドステートメントやパラメータ化クエリを用いることが標準になっています。またファイルアクセス等でパスを受け取る場合はホワイトリスト制御や basename/realpath による検証を行うことが望ましく、予期しないファイルへのアクセスを防ぎます。
SQLインジェクション対策
データベース操作において GET パラメータを直接クエリの中に入れることは重大なリスクです。プレースホルダ付きクエリやプリペアドステートメントを用い、入力値は integer 型やシンプルな文字列としてバリデーションまたは型変換してから渡すことが安全です。
XSS(クロスサイトスクリプティング)対策
画面表示の際に htmlspecialchars を活用し、HTML の枠組みの中でコードとして実行されないようにします。属性値や JavaScript コンテキスト内で出力する際には更なる注意が必要で、例えば json_encode を使ったり、JS エスケープ処理を行ったりすることで安全性を高めます。
ファイルパス操作や定数の検証
GET パラメータにファイル名やパスを含める処理がある場合、basename や realpath で正規化し、ディレクトリ外アクセスを防ぎます。さらに受け入れ可能なファイル拡張子のリストを用意し、ホワイトリスト方式で検証することで未知の拡張子による攻撃を防ぐことができます。
実践的な例:安心できる GET パラメータ取得のコードパターン
ここでは実際に使えるコードパターンを紹介します。基本的な取得からフォーム機能、ページネーション、検索機能などで安全性と可読性を兼ね備えた設計を意識します。
ID を整数として取得する例
以下は「id」というキーを GET から受け取り、それが整数か検証してから処理するパターンです。指定されていない場合、誤りとして処理するかデフォルト値を設定します。
<?php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($id === null) {
// 値が送信されていない
http_response_code(400);
exit('id パラメータが見つかりません');
} elseif ($id === false) {
// 整数ではない
http_response_code(400);
exit('id は整数でなければなりません');
}
// 安全な整数値 $id を使う処理
?>
複数パラメータを一括で処理する例
検索フォームなどで名前、メールアドレス、年齢など複数の値を GET で受け取る場合の処理例です。個別にフィルタやバリデーションを定義して使います。
<?php
$filters = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 0, 'max_range' => 150]
]
];
$data = filter_input_array(INPUT_GET, $filters, true);
if ($data === false) {
exit('入力データの取得に失敗しました');
}
if (in_array(false, $data, true) || $data['email'] === false) {
exit('不正な入力があります');
}
// $data['name'], $data['email'], $data['age'] に安全な値が入っている
?>
GET パラメータを使ったページネーションの例
ページネーションでは「page」や「limit」などの数値パラメータを GET で受け取り、範囲チェックを行ってから SQL クエリ等に渡すことが重要です。負の値や異常に大きな値を防ぎ、デフォルト値を設けることで予期せぬ問題を回避できます。
<?php
$page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]);
if ($page === null || $page === false) {
$page = 1;
}
$limit = 20;
// オフセット計算など
$offset = ($page - 1) * $limit;
// クエリ構築など
?>
PHP GET パラメータ取得でよくある誤りと修正方法
初心者や慣れていない開発者が陥りやすいミスと、それを回避するための修正方法を整理します。デバッグしにくい問題の原因にもなるため、早い段階で理解しておくとよいです。
未設定のキーにアクセスしてエラーになる
$_GET[‘key’] を直接参照すると、存在しない場合に「未定義の配列キー」の警告が出ます。isset や array_key_exists で存在を確認することでこれを回避できます。さらに値が空文字列かどうかも empty 関数でチェックするのが望ましいです。
不正な型や範囲外の値が入る
数値パラメータに文字列が混じる、負の数や異常値が送信されると後続処理に影響します。FILTER_VALIDATE_INT を使ったり、範囲オプションを設定したりキャストしたりすることでこの問題を防げます。安全重視のアプリケーションでは必ず範囲チェックを行います。
出力時のエスケープ忘れ
取得はできていても、画面表示の際に htmlspecialchars を使わないと XSS 攻撃に利用される可能性があります。特に HTML 属性内や JavaScript コンテキスト内での出力では、より厳密なエスケープあるいは出力フィルタが必要です。
FILTER_SANITIZE_STRING の非推奨対応
最新の PHP バージョンでは FILTER_SANITIZE_STRING が非推奨または削除されています。文字列のサニタイズには FILTER_SANITIZE_FULL_SPECIAL_CHARS や htmlspecialchars の組み合わせを用いるように移行することが望ましいです。
まとめ
PHPでGETのパラメータを取得する際は、$_GET を使う基本方法を理解したうえで、filter_input や filter_input_array を用いたサニタイズ・バリデーションをしっかり行うことが重要です。これにより、数値の型チェックや、予期せぬ値の扱い、画面表示時の XSS 対策が可能になります。
また未設定のキーの扱い、出力時のエスケープ、フィルタの適切な選択などは細かいですがセキュリティ・ユーザー体験を左右するポイントです。ページネーションや検索、フォーム入力など、実際のアプリケーションでこれらを組み込むことで実践力が身につきます。安全なコードが Web を強化します。
コメント