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

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

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

作成日: 更新日:

基本的な使い方

INPUT_SERVER定数は、PHPの入力フィルタリング機能において、スーパーグローバル変数である$_SERVERからの入力を指定するための定数です。

この定数は主に、filter_input()関数のような入力フィルタリング関数と組み合わせて使用されます。$_SERVER変数には、Webサーバーによって提供される情報や、HTTPヘッダー、現在のスクリプトのパス、リクエストメソッド(GETやPOST)など、現在の実行環境に関する多岐にわたる情報が格納されています。例えば、Webサーバーが受信したHTTPリクエストの特定のヘッダー値や、クライアントのIPアドレス、リクエストされたURLのパスなどを取得する際に利用できます。

INPUT_SERVERとフィルタリング関数を組み合わせることで、開発者は$_SERVERから取得したデータを直接使用する前に、そのデータを検証し、必要に応じてサニタイズ(安全な形式に変換)することができます。これにより、不正な入力データによるクロスサイトスクリプティング(XSS)のようなセキュリティ上のリスクを低減し、予期しない形式のデータが処理されることによるエラーを防ぐなど、アプリケーションの堅牢性を高めるのに役立ちます。

特に、外部からの信頼できないデータ(Webサーバーから提供される情報の一部も含む)を扱う際には、このフィルタリング機能とINPUT_SERVER定数を活用することで、より安全で信頼性の高いコードを記述することが可能になります。これは、システムエンジニアを目指す上で重要なセキュリティプラクティスの一つです。

構文(syntax)

1<?php
2
3$requestMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD');
4
5?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP filter_input でサーバー情報取得

1<?php
2
3/**
4 * INPUT_SERVER 定数と filter_input() 関数を使用して、
5 * $_SERVER スーパーグローバル変数からサーバー情報を安全に取得する方法を示します。
6 *
7 * システムエンジニアを目指す初心者向けに、簡潔な例を提供します。
8 */
9function getAndDisplayServerInfo(): void
10{
11    echo "--- filter_input(INPUT_SERVER) の使用例 ---\n\n";
12
13    // 1. HTTPリクエストメソッドを取得
14    // 例: GET, POST。特殊文字をエスケープして安全に表示します。
15    $requestMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
16    if ($requestMethod !== null) {
17        echo "リクエストメソッド: " . $requestMethod . "\n";
18    } else {
19        echo "リクエストメソッドの取得に失敗しました。\n";
20    }
21
22    // 2. クライアントのIPアドレスを取得
23    // IPアドレスとして有効か検証し、不正な値は除去します。
24    $remoteAddr = filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
25    if ($remoteAddr !== false && $remoteAddr !== null) {
26        echo "リモートIPアドレス: " . $remoteAddr . "\n";
27    } else {
28        echo "リモートIPアドレスの取得に失敗しました。または無効です。\n";
29    }
30
31    // 3. ユーザーエージェント(ブラウザ情報など)を取得
32    // 特殊文字をエスケープして安全に表示します。
33    $userAgent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
34    if ($userAgent !== null) {
35        echo "ユーザーエージェント: " . $userAgent . "\n";
36    } else {
37        echo "ユーザーエージェントの取得に失敗しました。\n";
38    }
39
40    // 4. 存在しないサーバー変数を取得しようとした場合
41    // 存在しない場合、filter_input() は null を返します。
42    $nonExistentVar = filter_input(INPUT_SERVER, 'NON_EXISTENT_SERVER_VARIABLE');
43    if ($nonExistentVar === null) {
44        echo "存在しない変数 'NON_EXISTENT_SERVER_VARIABLE' は null を返しました。\n";
45    }
46}
47
48// 関数を実行
49getAndDisplayServerInfo();
50
51?>

PHPのINPUT_SERVER定数は、サーバー環境に関する情報を扱う際に使用される組み込みの定数です。この定数自体には引数や戻り値はありませんが、filter_input()関数と組み合わせて、$_SERVERスーパーグローバル変数に格納されているサーバー情報を安全に取得するために利用されます。

サンプルコードでは、filter_input()関数の第一引数にINPUT_SERVERを指定し、第二引数に取得したいサーバー変数の名前(例: 'REQUEST_METHOD''REMOTE_ADDR')を渡しています。これにより、$_SERVER変数から特定のデータを取得します。さらに第三引数としてフィルターを指定することで、取得したデータを検証したり、セキュリティ上問題のある文字を無害化(サニタイズ)したりすることが可能です。

例えば、リクエストメソッドやユーザーエージェントの取得ではFILTER_SANITIZE_FULL_SPECIAL_CHARSフィルターを適用し、HTML特殊文字をエスケープすることで、クロスサイトスクリプティング(XSS)といった脆弱性を防ぎます。また、リモートIPアドレスの取得ではFILTER_VALIDATE_IPフィルターを用いて、取得した値が有効なIPアドレス形式であるかを厳密に検証しています。

filter_input()関数は、指定された変数が存在しない場合や、フィルターによる検証・サニタイズに失敗した場合にnullfalseを返します。この戻り値を確認することで、プログラムは取得したデータが有効であるかを判断し、より安全で堅牢な処理を実行できるようになります。このように、INPUT_SERVER定数とfilter_input()関数を組み合わせることで、サーバー情報を安全に扱うことが推奨されます。

このサンプルコードでは、$_SERVERスーパーグローバル変数を直接使用する代わりに、filter_input()関数を使うことで、より安全にサーバー情報を取得する方法を示しています。filter_input()を利用することで、悪意のあるデータや不正な形式の入力からシステムを保護するセキュリティ対策が強化されます。

特に重要なのは、FILTER_SANITIZE_FULL_SPECIAL_CHARSのようなサニタイズフィルターで特殊文字をエスケープすることや、FILTER_VALIDATE_IPのようにデータの形式を検証するフィルターを適用することです。これにより、クロスサイトスクリプティング(XSS)などの脆弱性を防ぎ、安全な情報表示やデータ利用が可能になります。

また、filter_input()関数は、取得しようとしたデータが存在しない場合や、指定したフィルターによる検証に失敗した場合にnullfalseを返します。そのため、必ず戻り値をチェックし、適切なエラー処理や代替処理を記述することが、堅牢なプログラムを作成する上で非常に大切です。

PHP INPUT_SERVERでサーバー情報取得

1<?php
2
3declare(strict_types=1);
4
5/**
6 * サーバー情報取得関数
7 *
8 * PHPの`INPUT_SERVER`定数を使用して、`$_SERVER`グローバル変数から
9 * 特定の情報を安全に取得する方法を示します。
10 * `INPUT_SERVER`は、`filter_input()`関数と組み合わせて使用し、
11 * サーバーからの入力データをフィルタリングする際のソースを指定します。
12 *
13 * システムエンジニアを目指す方へ:
14 * `max_input_vars`はPHPの設定項目で、HTTPリクエストで受け付ける
15 * GET/POST/COOKIE変数の最大数を制限します。これは、悪意のある大量の
16 * データ送信からサーバーを保護するために重要です。
17 * `INPUT_SERVER`が`$_SERVER`の情報を扱うのに対し、`max_input_vars`は
18 * 主にユーザーからの入力データに適用されるという違いを理解しておきましょう。
19 */
20function getServerInfo(): void
21{
22    // INPUT_SERVER を使用して、現在のリクエストメソッド (例: GET, POST) を取得し、サニタイズします。
23    // filter_input は、$_SERVER スーパーグローバル変数から安全に値を取得する推奨される方法です。
24    $requestMethod = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_SPECIAL_CHARS);
25
26    // INPUT_SERVER を使用して、サーバーのホスト名を取得し、ドメインとして検証します。
27    $httpHost = filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_VALIDATE_DOMAIN);
28
29    echo "<h3>サーバー入力情報</h3>";
30
31    // 取得したリクエストメソッドを表示します。
32    if (is_string($requestMethod)) {
33        echo "<p>リクエストメソッド: " . $requestMethod . "</p>";
34    } else {
35        echo "<p>リクエストメソッドが見つからないか、不正です。</p>";
36    }
37
38    // 取得したHTTPホスト名を表示します。
39    if (is_string($httpHost)) {
40        echo "<p>HTTPホスト: " . $httpHost . "</p>";
41    } else {
42        echo "<p>HTTPホストが見つからないか、不正です。</p>";
43    }
44}
45
46// 関数を実行して結果を表示します。
47getServerInfo();
48

PHPのINPUT_SERVERは、filter_input()関数と組み合わせて使用する定数で、$_SERVERスーパーグローバル変数からサーバー関連の情報を安全に取得するために用いられます。この定数自体に引数や戻り値はありませんが、filter_input()関数の第一引数として指定することで、サーバーからの入力データを対象としたフィルタリングや検証処理を適用できます。

サンプルコードでは、INPUT_SERVERを利用して現在のリクエストメソッドやHTTPホスト名を取得し、それぞれ特殊文字のサニタイズやドメイン形式の検証を行っています。これにより、直接$_SERVERにアクセスするよりも推奨される安全な方法で情報を扱い、不正なデータがアプリケーションに影響を与えるのを防ぎます。

また、max_input_varsはHTTPリクエストで受け付けるGET/POST/COOKIE変数の最大数を制限するPHPの設定項目であり、悪意のある大量データ送信からサーバーを保護する目的があります。INPUT_SERVERが特定のサーバー入力の取得と検証に焦点を当てるのに対し、max_input_varsは主にユーザーからの入力データの総数に対するセキュリティ対策として機能します。両者は異なる役割を持つものの、どちらもセキュリティ面で重要な要素であることを理解しておくことが大切です。

INPUT_SERVER定数は、filter_input()関数と組み合わせて$_SERVERグローバル変数からの情報を安全に取得する際に使用します。$_SERVERのデータを直接使うのではなく、filter_input()で適切なフィルター(例: FILTER_SANITIZE_SPECIAL_CHARSFILTER_VALIDATE_DOMAIN)を適用することで、セキュリティリスクを大幅に低減できます。これは不正な入力からシステムを保護するための重要な対策です。max_input_varsはGET/POST/COOKIE変数などユーザーからの入力数の制限に関わる設定であり、INPUT_SERVERが扱うサーバー由来の情報とは対象が異なりますので注意が必要です。取得したデータの型チェックも必ず行いましょう。

関連コンテンツ