スーパーグローバル変数とは?
PHPでプログラムを書いていると、フォームの入力内容を受け取ったり、URLに含まれる値を使ったり する場面がよく出てきます。
こうした「外部から渡されるデータ」や「サーバーの情報」を簡単に扱えるように、PHPには あらかじめ特別な変数 が用意されています。これが スーパーグローバル変数(Superglobal variables) です。
- PHPが最初から用意している「特別な変数」
- どこからでも(関数の中でも)使える → グローバルスコープで常に利用可能
- すべて 連想配列 の形になっている
- フォーム入力・URLパラメータ・ファイルアップロードなどに欠かせない
例えば「ログインフォームで入力したユーザー名を受け取る」ときは $_POST を、
「検索ページで ?keyword=PHP のようにURLに含まれる値を使う」ときは $_GET を使います。
また、スーパーグローバル変数を使うときには セキュリティ対策(htmlspecialchars() など) を忘れないことが大切です。外部から来たデータをそのまま表示すると、クロスサイトスクリプティング(XSS)と呼ばれる攻撃の原因になるからです
主なスーパーグローバル変数一覧
| 変数名 | 内容・用途の例 |
|---|---|
$_POST | フォームで POST送信 された値を取得(ログイン・会員登録など) |
$_GET | URLに含まれる GETパラメータ を取得(検索キーワード、ページ切替など) |
$_REQUEST | POST・GET・COOKIE の値をまとめて取得(便利だが区別できないため基本は非推奨) |
$_SERVER | サーバー情報や現在のURL、ヘッダーなどを取得 例: $_SERVER['REQUEST_METHOD'] で「GETかPOSTか」を判定 |
$_SESSION | ユーザーごとの状態を一時的に保存(ログイン状態の保持など) |
$_COOKIE | ブラウザに保存されたクッキーの値を取得(ログイン情報やトラッキングなど) |
$_FILES | ファイルアップロード時に使う(画像やPDFなどを処理する) |
$_ENV | 環境変数を取得(サーバー設定や環境依存の情報など) |
$_GLOBALS | グローバル変数すべてを配列で取得(特殊用途。ほとんど使わない) |
スーパーグローバル変数は「どこから来たデータか」が命
スーパーグローバル変数はとても便利ですが、最も大事なのは そのデータが「どこから来たか」 を常に意識することです。
これらの変数の中身は、ほとんどが「ユーザーが操作できる情報」です。
例えば…
- フォームに入力された文字
- URLに付けられたパラメータ
- アップロードされたファイル名
- ブラウザが送ってくる情報
これらはすべて、ユーザー側で自由に書き換えることが可能です。
つまり、スーパーグローバル変数は便利な反面、 攻撃の入り口にもなるという性質を持っています。
外部データの流れ(イメージ)
ユーザーの入力・操作
↓
ブラウザがデータ送信
↓
サーバー(PHP)
↓
スーパーグローバル変数に格納
この仕組みを理解すると、「なんでセキュリティ対策が必要なのか」が自然に見えてきます。
$_POST の使い方(フォーム送信)
ログインやお問い合わせフォームなどで使われるのが $_POST です。
▼ フォーム側
<form method="post"> 名前:<input type="text" name="username"> <button>送信</button> </form>
▼ PHP側
<?php
$name = htmlspecialchars($_POST['username'], ENT_QUOTES);
echo "こんにちは、{$name}さん";
?>
ここで重要なのが
htmlspecialchars()
これを入れないと、悪意あるコードを入力された場合にページが改ざんされる危険があります(XSS攻撃=エスキューエルインジェクション)
$_GET の使い方(URLパラメータ)
検索機能やページ切り替えでよく使われるのが $_GET です。
URL例:
search.php?keyword=PHP
PHP側:
<?php $keyword = htmlspecialchars($_GET['keyword'], ENT_QUOTES); echo "検索キーワード:" . $keyword; ?>
GETはURLに値が見えるため、改ざんされやすいという特徴があります。
$_POST と $_GET の違い
| 項目 | $_POST | $_GET |
|---|---|---|
| データの見え方 | URLに表示されない | URLに表示される |
| 主な用途 | ログイン・登録 | 検索・ページ移動 |
| データ量 | 多く送れる | 制限あり |
| 改ざんのしやすさ | やや低い | 高い |
$_SESSION(ログイン状態の保持)
SESSIONは「ページをまたいでデータを保存」するための仕組みです。
<?php session_start(); $_SESSION['user_name'] = "tanaka"; ?>
別ページ:
<?php session_start(); echo $_SESSION['user_name']; ?>
これにより、
- ログイン状態
- カート情報
- 一時的なメッセージ
などを保持できます。
ページの最初にsession_start() を忘れると動きません。
$_FILES(ファイルアップロード)
画像やPDFをアップロードするときに使います。
<form method="post" enctype="multipart/form-data"> <input type="file" name="image"> <button>送信</button> </form>
<?php move_uploaded_file($_FILES['image']['tmp_name'], 'uploads/' . $_FILES['image']['name']); ?>
実務ではさらに
- ファイルサイズ制限
- 拡張子チェック
- 保存先の安全対策
が必要になります。
よくやるミス
| ミス | 原因 |
|---|---|
| Undefined index | 入力がないのに使用 |
| SESSIONが動かない | session_start() を書いていない |
| XSS脆弱性 | htmlspecialchars() を忘れている |
| POSTなのに$_GETで取得 | methodを確認していない |
セキュリティ上の最重要ポイント
スーパーグローバル変数の値は 絶対に信頼してはいけない
// 危険 echo $_GET['name'];
// 安全 echo htmlspecialchars($_GET['name'], ENT_QUOTES);
スーパーグローバル変数は
「ユーザーから届いたデータを受け取る窓口」
ですが同時に
「攻撃が入り込む入口」
でもあります。
そのため常に
- 入力チェック
- エスケープ処理
- 型の確認
を行うことが大切です。これらをしっかりと理解すれば、フォーム処理・ログイン機能・アップロード機能 など安心してPHP開発できます。

