Webアプリ開発でよく登場する「GETパラメータ」。URLに含まれる値をPHPで受け取り、動的な処理を行いたい場面が数多くあります。しかしその取り扱いを誤るとセキュリティの問題が発生することも。この記事では、GETパラメータの基本的な取得方法から存在チェック、安全な取り扱い、最新のベストプラクティスまで、初心者から中級者が満足できるようにやさしく丁寧に解説します。
目次
PHP GET パラメータ 取得の基本:$_GETの使い方と意味
PHPでGETパラメータを取得する最も基本的な方法がスーパーグローバル変数$_GETを使うことです。クエリストリング(URL?以下の部分)で指定されたキーと値が連想配列形式で格納されます。URLに含まれる項目が自動的にキーと値のペアとして変数に読み込まれるため、たとえば「?name=Taro」のようなパラメータであれば$_GET[‘name’]でTaroを取得できます。
$_GETの値はURLデコードされた状態で渡され、クエリ文字列が存在しない場合は空の配列として扱われます。また、HTTPリクエストがGETでなくともURLにクエリが含まれていれば$_GETに含まれます。これにより、フォームやリンクからのパラメータ受け取りが可能になります。安全性や使い方には注意点がありますが、基本操作としてはこの仕組みを理解することが第一歩です。
$_GETの構造とは何か
$_GETはスーパーグローバル変数の一つで、スクリプト全体で使える連想配列です。キーがパラメータ名、値がその値となります。URLパラメータが存在しない場合そのキーは存在しないのでisset関数で確認する必要があります。
また、自動的にURLエンコード/デコード処理されるため、特に手動でurldecodeを呼び出す必要は基本的にありません。さらに変数名にスペースやドットが含まれる場合にはアンダースコアに置換されることがあります。この構造を押さえておくことでパラメータの取りこぼしを防げます。
issetと空文字のチェック方法
$_GET[‘param’]を使う前に、まずisset($_GET[‘param’])で存在を確認することが重要です。存在していても空文字や想定外の値であることもあるため、trimや条件分岐で空かどうかをチェックすることが望ましいです。
例えばissetで真偽値を判定し、さらに”(空文字)との比較またはstrlenを使って長さを確認するパターンがよく使われます。こうした存在チェックは、警告やエラー、未定義変数の発生を防ぐだけでなく、意図しない挙動を避ける役割も果たします。
複数の値・配列形式のGETパラメータ取得
GETパラメータには配列形式を含めることができます。たとえばname[]=A&name[]=Bのような書き方をすると、$_GET[‘name’]が配列として取得されます。また、parse_str関数を使うことで文字列をパースして配列にすることも可能です。
ただし、parse_strを使う場合には第二引数で結果格納用の配列を指定することがPHPの最新バージョンでは必須になっており、省略すると警告が発生したり推奨されなくなっているので注意が必要です。
パラメータの値を取得して活用する方法:filter_inputとfilter_varの使いどころ
$_GETを直接利用するだけでなく、PHPにはfilter_inputやfilter_varといった入力値の検証・無害化のための関数が用意されています。これらを使うことでセキュリティを強化しつつ、予期しないデータ型や形式の異常値を除外できます。
filter_input(INPUT_GET, ‘key’, フィルター)という形式でGETパラメータを取得しつつフィルターが適用でき、入力値がない場合にはfalseまたはnullを返す設定もできます。filter_varはすでに取得した値に対して後処理を行いたいときに使われます。こうした関数を適切に使い分けることで、安全で信頼性のある処理が可能になります。
filter_inputによる取得と無害化
filter_inputはINPUT_GETを指定することでGETパラメータから直接値を取得しつつ、FILTER_SANITIZE系やVALIDATE系フィルターを使って無害化や検証が可能です。例えば文字列の特殊文字対策、数値型チェック、メールアドレス形式の確認などに使えます。
この関数は、元の$_GETの内容を直接扱うのではなく、SAPI経由で取得された「生」の値を対象とするため、スクリプト内部で$_GETを加工してからfilter_inputする操作は反映されません。入力の出どころを明確にすることができます。
filter_varで取得後の値を検証する例
URLパラメータで取得した値を一旦変数に代入し、その後filter_varを使って検証や変換を行う方法です。例えば数値として扱いたいパラメータにはFILTER_VALIDATE_INTを使い、期待する範囲かどうかをチェックできます。
また、文字列についてはFILTER_SANITIZE_SPECIAL_CHARSを使ってHTMLエスケープを行うことができます。こうした処理は出力時だけでなく、できるだけ入力の段階で行うと安全性が高まります。
デフォルト値の設定と条件分岐
GETパラメータが指定されていない場合や空のときにデフォルト値を使いたいケースがあります。その際には三項演算子やnull合体演算子を使ってデフォルトを設定します。例えば$value = isset($_GET[‘param’]) ? $_GET[‘param’] : ‘default’; またはPHP7以降では$value = $_GET[‘param’] ?? ‘default’;という形が使われます。
これによりパラメータ未指定時の処理を整理でき、コードの可読性と堅牢性が向上します。
セキュリティを考えたPHP GET パラメータ 取得と取り扱い
GETパラメータはユーザーが自由に操作できる入力であるため、適切な検証と無害化を行わないと様々な脆弱性の原因となります。特にSQLインジェクションやクロスサイトスクリプティング(XSS)、ディレクトリトラバーサルなどが挙げられます。最新情報を踏まえてこれらのリスクを避ける手段を具体的に説明します。
XSS対策:HTML出力時のエスケープ
GETパラメータの値をそのままHTMLに出力するとスクリプトインジェクションの危険があります。htmlspecialchars関数を使って特殊文字( & ” ‘ など)をエスケープすることが基本です。出力コンテキストによってはENT_QUOTESやUTF-8指定も忘れずに行うとよいです。
また、filter_inputやfilter_varで文字列を無害化するフィルターを使うことで、出力時に必要な処理を減らすことができますが、出力時のエスケープは最後まで意識することが重要です。
SQLインジェクション対策とプリペアドステートメント
GETパラメータの値をデータベースクエリに直接組み込むのは非常に危険です。数値型チェックを行うか、プリペアドステートメントを使用して値をバインドすることで攻撃を防げます。FILTER_VALIDATE_INTなどを使って型を検証するか、事前にキャストや正規表現で検証するのが望ましいです。
データベース操作が関わる部分では疑わしい入力は受け取らず、バインディング変数やパラメータ化されたクエリを使うことで安全性が大幅に向上します。
その他の攻撃リスクとその防止策
ディレクトリトラバーサル( ../ など)によるファイルアクセス、HTTPヘッダーインジェクション、double encoding攻撃などが挙げられます。$_GETは自動でURLデコードされるので、さらにurldecodeをかけると意図せぬ二重デコードになる攻撃が可能になります。
また、リクエストメソッドの確認、期待するパラメータ名・型の白リスト設計、長さ制限などを設けることで、全体的なセキュリティ強度を高めることができます。
実践例:条件分岐と応用的な使い方 PHP GET パラメータ 取得活用ケース
実際にGETパラメータを取得して動作を切り替えるケースは非常に多くあります。検索機能、ページング、フィルタリング、トラッキングなどが典型例です。ここでは応用例とともに、保守性や拡張性を意識した設計についても触れます。
検索・ソート機能での使用例
サイト内検索や表のソート機能などでは、キーワードや並び順などをパラメータで受け取り処理を変えることが多いです。例としては /search.php?keyword=book&order=asc のようなケースで、$_GET[‘keyword’]で検索語を取得し、$_GET[‘order’]でソート順を取得します。
この際、orderパラメータは事前に指定可能な値(asc/descなど)を制限し、それ以外が来たらデフォルトを採用するといったバリデーションが望ましいです。こうすることで想定外の動作を防げます。
ページネーションでの使い方
長い一覧表示を分割するページネーションでは、現在ページ番号をGETパラメータで指定することが一般的です。例:page=1、page=2など。これを取得してオフセットを計算し、DBから取得するレコードを限定します。
ここでもページ番号が数値であること、1以上の値であること、範囲外でないことなどを検証します。負数や0、非常に大きな数値が来る可能性も考慮して制限をかけることが重要です。
API用途・REST風URLとの併用
APIやREST風のURL設計では、パラメータをGETで受け取ることが多くあります。またはルーティングでURLパラメータを分解してGETに渡すこともあります。たとえば /api/items?id=10 のようなクエリ形式や、フレームワークで /api/items/10 のようなパス形式をGETパラメータとして扱う設計が考えられます。
その場合、ルーティング処理で値を抽出し、filter_inputやフィルター付きで変数に格納し、さらに出力やDB操作時に検証・無害化を行う設計が保守性とセキュリティの両面で優れています。
よくあるトラブルとその対処方法 PHP GET パラメータ 取得で注意したいポイント
GETパラメータ取得時には思わぬトラブルが生じがちです。未定義キーのアクセス、値の予期せぬ型、二重デコード、長すぎるパラメータ、重複キー、配列形式の崩れなどが典型例です。経験豊かな開発者でも見落としやすいこれらを理解し、対処できるように解説します。
未定義キーにアクセスしたときの警告対応
$_GET[‘key’]を直接参照すると、keyが存在しない際にNoticeが発生します。エラーレベル設定によっては画面に表示されたりログに記録されたりします。対策としてisset()で存在確認を行うか、null合体演算子を使ってデフォルト値を指定することが推奨されます。
また、filter_inputではそのキーが存在しない場合にfalseまたはnullを返すため、issetチェックと併用することでより堅牢なコードになります。
型違い・想定外の値の受け取り
文字列で受け取るつもりが数字や記号が混ざっていたり、空白・制御文字が含まれていたりするケースがあります。これを防ぐには正規表現、numericチェック関数、filter_VALIDATE系フィルターの活用などがあります。
特に数値型や日付型など明確に型が決まっているパラメータでは厳密なチェックと範囲制限を設けることが安全性と信頼性を高めます。
二重デコードや文字エンコーディングの問題
$_GETの値はPHPが自動でURLデコードしたものです。したがって、さらにurldecodeをかけると二重デコードとなり、不正入力を意図せず許してしまう場合があります。また、異なる文字エンコーディングの混在もXSSなどの脆弱性につながることがあります。常に期待する文字エンコーディング(通常UTF-8)で処理することが重要です。
最新のベストプラクティスと2026年現在の推奨方法 PHP GET パラメータ 取得
技術は日々進化しており、GETパラメータ取り扱いに関するベストプラクティスも更新されています。ここでは2026年の現場で広く採用されている最新の注意点や推奨スタイルを紹介します。
スーパーグローバルの直接操作の抑制とラッパーの活用
直接$_GETをスクリプトのあちこちで使うと保守性が低くなります。最近では入力値取得と検証を一元化するラッパー関数やクラスを使う設計が増えています。これにより、どこで何を検証しているかが明確になり、セキュリティ上の見落としを防げます。
フィルター拡張の最新仕様と推奨設定
PHPのfilter_input・filter_input_array・filter_varといったフィルター関数は最新バージョンで仕様が改良されており、非推奨になったフィルタがあることに注意が必要です。例えばFILTER_SANITIZE_STRINGは一部のバージョンで非推奨表記がなされており、それに代わる方法が推奨されています。
また、フィルター使用時にはFILTER_FLAGなどのオプション指定で配列形式への対応やNULL時の挙動を制御することが可能で、柔軟性と安全性の両立が実現されています。
出力時の標準化と環境に依存しない文字コード管理
入力がUTF-8かどうかをチェックし、想定と異なる場合の処理を設けることが大切です。エスケープやサニタイズ後の出力に対しても文字コードを明示するなど、環境による揺らぎを少なくするスタイルが支持されています。
さらに、テンプレートエンジンやフレームワークのビュー層でのエスケープ機能を使うことにより、出力場所ごとに適切な対処を施す設計が主流になっています。
まとめ
PHPでGETパラメータを取得するには、まず$_GETを使った基本的な方法を理解することが大切です。issetやデフォルト値の設定による存在チェック、配列形式の取り扱いなどを押さえておくことで、思わぬミスを防げます。
さらにfilter_inputやfilter_varなどの検証・無害化の関数を使い、SQLインジェクションやXSSなどを防止することが安全な開発には不可欠です。最新のベストプラクティスではこれらの処理を一元化し、出力時のエスケープや文字コード管理を標準化する設計が支持されています。
この記事で紹介した内容を実践することで、動的で安全な処理ができるようになり、PHPでGETパラメータを取得するスキルを確かなものにできるはずです。
コメント