この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:atom
更新日時:2026-06-11 07:07:02

タイトル: スーパーグローバル変数
SEOタイトル: PHP スーパーグローバル変数完全リファレンス

この記事の要点
  • スーパーグローバルはスコープを越えてどこからでも参照可能な PHP 組込配列
  • 一覧: $GLOBALS / $_SERVER / $_GET / $_POST / $_REQUEST / $_COOKIE / $_SESSION / $_FILES / $_ENV
  • 外部入力($_GET/$_POST/$_REQUEST/$_COOKIE)は必ずバリデーション + エスケープ
  • $_REQUEST は GET / POST / COOKIE が混在する → 明示的に区別する方が安全
  • Laravel では基本 Illuminate\Http\Request を経由(DI 注入 + バリデーション)

スーパーグローバル一覧と用途

変数内容主な用途
$GLOBALS全てのグローバル変数の連想配列関数内からグローバル変数参照
$_SERVERサーバ・実行環境情報URL / IP / UA / メソッド取得
$_GETURL クエリ文字列検索条件、ページ番号
$_POSTPOST ボディ(form-urlencoded / multipart)フォーム入力
$_REQUESTGET / POST / COOKIE をマージ非推奨。明示の方が安全
$_COOKIEクライアント送信の Cookieセッション ID / ログイン状態
$_SESSIONセッション変数ログインユーザ情報
$_FILESアップロードファイルmultipart/form-data
$_ENV環境変数API キー、DB 接続情報

$_SERVER 主要キー

$_GET / $_POST: 外部入力のセキュリティ

外部入力は必ず: ① 存在チェック ② バリデーション ③ エスケープ。

prepare('SELECT * FROM users WHERE name LIKE ?');
$stmt->execute(['%' . $keyword . '%']);
$users = $stmt->fetchAll();

// ❌ NG: 文字列結合は致命的
$pdo->query("SELECT * FROM users WHERE name = '" . $_GET['q'] . "'");
// → q=' OR 1=1-- で全件取れる

$_REQUEST の罠

$_REQUEST は GET / POST / COOKIE をマージしたもの。同じキーがあるとどれが採用されるか不定になり、Cookie 経由で値を上書きされる脆弱性につながります:

$_SESSION

$_COOKIE と setcookie()

 time() + 86400 * 30,
    'path'     => '/',
    'domain'   => '.example.com',
    'secure'   => true,         // HTTPS のみ
    'httponly' => true,         // JS から読めない
    'samesite' => 'Lax',        // CSRF 対策
]);

// 削除(過去時刻にセット)
setcookie('theme', '', time() - 3600, '/');

$_ENV と環境変数

$GLOBALS

Laravel の Request クラスとの違い

Laravel では生のスーパーグローバルを直接触る必要はほぼありません:

input('id');
    $id = $request->query('id');     // GET 限定
    $id = $request->post('id');      // POST 限定

    // ヘッダ・URL 等($_SERVER 相当)
    $ua = $request->userAgent();
    $ip = $request->ip();
    $method = $request->method();
    $url = $request->fullUrl();

    // ファイル($_FILES 相当)
    $file = $request->file('avatar');

    // セッション($_SESSION 相当)
    $request->session()->put('key', 'value');
    session('key');                  // ヘルパでも可

    // Cookie($_COOKIE 相当)
    $value = $request->cookie('name');
    Cookie::queue('name', 'value', 60);

    // 環境変数
    $dbHost = config('database.connections.mysql.host');  // ★ env() でなく config()
}

セキュリティ・チェックリスト

対象リスク対策
$_GET / $_POST を HTML 出力XSShtmlspecialchars()
$_GET / $_POST を SQL に渡すSQL Injectionprepared statement
$_GET / $_POST をシェル実行OS Command Injectionescapeshellarg()
$_FILES の type / name を信用RCE / 改ざんサーバ側で再検証
$_SERVER['PHP_SELF'] を直接出力XSSSCRIPT_NAME を使う
$_SERVER['HTTP_X_FORWARDED_FOR']偽装信頼するプロキシのみで採用
$_REQUEST を使う取得元不定$_GET / $_POST 明示

FAQ

Q: なぜスーパーグローバルと呼ぶ?
A: 関数内であっても global 宣言なしで参照できる「特別なグローバル」だからです。

Q: $_SESSION が空
A: session_start() 忘れか、Cookie 送信失敗、別ドメイン間で共有しようとしている等。session_status() で状態確認。

Q: $_POST が空で送れない
A: Content-Typeapplication/json なら $_POST には入りません(php://input + json_decode で読む)。