Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】INPUT_GET定数の使い方

INPUT_GET定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

INPUT_GET定数は、PHPにおいてHTTP GETリクエストのデータを指し示す定数です。ウェブブラウザからウェブサーバーに送信されるURLの末尾に付加されるクエリ文字列(例えば、http://example.com/index.php?id=123&name=Aliceid=123&name=Alice の部分)に含まれるデータへのアクセスを示します。

この定数は、主にPHPのフィルター拡張機能で使用されるもので、特にfilter_input()関数やfilter_var_array()関数と組み合わせて利用されます。これらの関数とINPUT_GETを組み合わせることで、ウェブアプリケーションが受け取るGETリクエストのデータを安全かつ厳密に取得し、検証(バリデーション)や無害化(サニタイズ)を行うことが可能です。

$_GETスーパーグローバル変数も同じデータにアクセスできますが、filter_input()などのフィルター関数とINPUT_GETを組み合わせることで、入力データの型チェック、不正な文字の除去、特定の形式への変換などを、より体系的かつ安全に処理できます。これにより、SQLインジェクションやクロスサイトスクリプティング(XSS)といったセキュリティ上の脆弱性からアプリケーションを保護し、堅牢なシステムを構築するために非常に重要な役割を果たします。ユーザーからの入力を扱う際には、セキュリティとデータの正確性を確保するため、この定数とフィルター機能の利用が推奨されます。

構文(syntax)

1$value = filter_input(INPUT_GET, 'variable_name');

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHPでGETリクエストから安全にinputを取得する

1<?php
2
3/**
4 * HTTP GETリクエストからパラメータを安全に取得する方法を示します。
5 *
6 * このコードをテストするには:
7 * 1. ファイルを `index.php` などのPHPファイル名で保存します。
8 * 2. ウェブブラウザで以下のURLにアクセスします。
9 *    - `http://localhost/index.php?username=Alice`
10 *    - `http://localhost/index.php?username=Bob`
11 *    パラメータなしでアクセスする場合:
12 *    - `http://localhost/index.php`
13 *    XSS攻撃のテストとして:
14 *    - `http://localhost/index.php?username=<script>alert('XSS')</script>`
15 */
16function processGetRequest(): void
17{
18    // INPUT_GET定数:$_GETスーパーグローバル配列から値を取得することを示します。
19    // filter_input()関数:外部から取得した変数を安全に取得し、フィルタリングするために使用されます。
20    // 'username':取得したいGETパラメータのキー(例:?username=value)。
21    // FILTER_SANITIZE_FULL_SPECIAL_CHARS:HTMLエンティティに変換することで、特殊文字をサニタイズし、
22    // ウェブページでの表示を安全にします。
23    $username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
24
25    if (null !== $username && $username !== false) {
26        // 'username'パラメータが存在し、正常にサニタイズされた場合
27        echo "こんにちは、 " . $username . "さん!";
28    } else {
29        // 'username'パラメータが提供されていない、またはフィルタリング後に空であった場合
30        echo "URLに 'username' パラメータを指定してください (例: ?username=YourName)。";
31    }
32}
33
34// スクリプトが実行されたときに機能を呼び出します。
35processGetRequest();
36
37?>

PHPのINPUT_GETは、HTTP GETリクエストを通じてウェブページに送られてくるデータ(URLのクエリパラメータ)を指し示すための定数です。この定数自体に引数や戻り値はありませんが、主にfilter_input()関数と組み合わせて使用され、外部からの入力を安全に取得する際に役立ちます。

サンプルコードでは、filter_input(INPUT_GET, 'username', FILTER_SANITIZE_FULL_SPECIAL_CHARS)という形で使われています。ここで、最初の引数であるINPUT_GETは「HTTP GETリクエストから値を取得する」という処理の対象を指定しています。2番目の引数'username'は、URLの?username=値のような形式で指定されるパラメータの名前です。3番目の引数FILTER_SANITIZE_FULL_SPECIAL_CHARSは、取得したデータに含まれるHTMLの特殊文字(例: <>)を安全な形式に変換し、悪意のあるスクリプト実行(XSS攻撃)を防ぐためのフィルタリング処理を指定しています。

この定数とfilter_input()関数を組み合わせることで、指定されたGETパラメータを安全に取得し、その値が存在すれば「こんにちは、[ユーザー名]さん!」と表示し、存在しない場合はパラメータの指定を促すメッセージを表示します。INPUT_GETを利用することは、$_GETスーパーグローバル変数を直接参照するよりも、より堅牢で安全な方法でユーザーからの入力を処理することにつながります。

INPUT_GETはURLのGETパラメータを安全に扱うための定数です。サンプルコードではfilter_input()関数と組み合わせることで、より安全なデータ取得を実現しています。外部からの入力は常に悪意のあるデータが含まれる可能性があるため、そのまま使用せず、必ずfilter_input()のような関数でフィルタリング(サニタイズ)してください。特にFILTER_SANITIZE_FULL_SPECIAL_CHARSは、HTML特殊文字を変換することでクロスサイトスクリプティング(XSS)攻撃からウェブページを保護するために不可欠です。また、filter_input()の戻り値がnullやfalseでないかを常に確認し、パラメータが期待通りに処理されたかを検証する習慣をつけましょう。これらは安全なウェブアプリケーション開発の基本となります。

PHPでGETパラメータを取得する

1<?php
2
3/**
4 * HTTP GETリクエストから指定されたパラメータの値を取得し、安全に出力します。
5 *
6 * この関数は、filter_input() 関数と INPUT_GET 定数を使用して、
7 * GETパラメータを安全に取得する方法を示します。
8 * 取得した値は XSS (クロスサイトスクリプティング) 攻撃を防ぐために
9 * htmlspecialchars() でエスケープされます。
10 *
11 * 例: http://localhost/your_script.php?username=Alice&message=Hello%20World!
12 *
13 * @param string $paramName 取得したいGETパラメータの名前。
14 * @return void
15 */
16function getAndDisplayGetParameter(string $paramName): void
17{
18    // INPUT_GET 定数を使用して、GETリクエストから指定されたパラメータの値を取得します。
19    // filter_input() の第3引数 (フィルタ) を省略すると、デフォルトで FILTER_UNSAFE_RAW が適用されます。
20    // これにより、基本的な文字列として値が取得されます。
21    $value = filter_input(INPUT_GET, $paramName);
22
23    // 値が取得できたか、またはフィルタリングに失敗しなかったかを確認します。
24    // null はパラメータが存在しない場合、false はフィルタリングに失敗した場合を意味します。
25    if ($value === null || $value === false) {
26        echo "<p>GETパラメータ '<strong>" . htmlspecialchars($paramName, ENT_QUOTES, 'UTF-8') . "</strong>' は存在しないか、取得できませんでした。</p>\n";
27    } else {
28        // XSS (クロスサイトスクリプティング) 攻撃を防ぐため、
29        // 出力する前に htmlspecialchars() で値をエスケープします。
30        $safeValue = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
31        echo "<p>GETパラメータ '<strong>" . htmlspecialchars($paramName, ENT_QUOTES, 'UTF-8') . "</strong>' の値: <code>{$safeValue}</code></p>\n";
32    }
33}
34
35// このスクリプトがWebサーバーを介してアクセスされたことを想定します。
36// 例として 'username' と 'message' というGETパラメータの取得を試みます。
37//
38// 以下のURLでアクセスしてみてください:
39// http://localhost/your_script.php?username=Alice&message=Hello%20World!
40// (your_script.php はこのファイルの名前)
41
42echo "<h1>GETパラメータの取得と表示の例</h1>\n";
43
44// 'username' パラメータを取得して表示
45getAndDisplayGetParameter('username');
46
47// 'message' パラメータを取得して表示
48getAndDisplayGetParameter('message');
49
50// 存在しないパラメータを試す
51getAndDisplayGetParameter('undefined_param');
52
53?>

PHPのINPUT_GET定数は、Webブラウザから送信されるHTTP GETリクエストのデータを安全に取得するために使われる特別な値です。WebページのURLに?以降で付加される情報をGETパラメータと呼びますが、この定数はfilter_input()関数と組み合わせることで、指定したパラメータの値を取り出す指示として機能します。

サンプルコードでは、getAndDisplayGetParameter関数がfilter_input(INPUT_GET, $paramName)を使って、URLからusernamemessageといった特定のGETパラメータの値を取得しています。例えば、http://localhost/your_script.php?username=AliceというURLでアクセスした場合、usernameの値としてAliceを取得できます。

取得した値は、悪意のあるスクリプトが混入する「XSS(クロスサイトスクリプティング)攻撃」を防ぐため、htmlspecialchars()関数で適切にエスケープ(特殊文字を無効化)してから画面に表示する安全対策も行っています。もし指定したパラメータが存在しない、または値の取得に失敗した場合は、その旨をユーザーに通知する処理も含まれており、堅牢なシステム開発に役立ちます。

INPUT_GET定数自体は引数を取らず、直接の戻り値もありません。しかし、filter_input()などの関数に渡すことで、「GETリクエストの入力データに対して操作を行う」という動作を指定する、非常に重要な役割を担っています。これにより、ユーザーからの入力を安全に処理する基盤となります。

INPUT_GETはHTTP GETリクエストのデータを示す定数で、filter_input関数と組み合わせて安全にGETパラメータを取得します。生の$_GET変数ではなくこの関数を使うことで、入力値の安全性を高めることができます。取得した値は、Webページに出力する前に必ずhtmlspecialchars()などでエスケープ処理し、XSS(クロスサイトスクリプティング)攻撃を防いでください。これはWebアプリケーション開発において非常に重要なセキュリティ対策です。filter_inputは、パラメータが存在しない場合はnull、取得に失敗した場合はfalseを返すため、これらの戻り値を適切に確認し、状況に応じて処理を分岐させることが大切です。サンプルコードは、URLのクエリ文字列から値を取得しますので、ブラウザで記載のURL形式を試して動作を確認してください。

関連コンテンツ