ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
スーパーグローバル一覧と用途
| 変数 | 内容 | 主な用途 |
|---|---|---|
$GLOBALS | 全てのグローバル変数の連想配列 | 関数内からグローバル変数参照 |
$_SERVER | サーバ・実行環境情報 | URL / IP / UA / メソッド取得 |
$_GET | URL クエリ文字列 | 検索条件、ページ番号 |
$_POST | POST ボディ(form-urlencoded / multipart) | フォーム入力 |
$_REQUEST | GET / POST / COOKIE をマージ | 非推奨。明示の方が安全 |
$_COOKIE | クライアント送信の Cookie | セッション ID / ログイン状態 |
$_SESSION | セッション変数 | ログインユーザ情報 |
$_FILES | アップロードファイル | multipart/form-data |
$_ENV | 環境変数 | API キー、DB 接続情報 |
$_SERVER 主要キー
<?php
$_SERVER['REQUEST_METHOD']; // GET / POST / PUT ...
$_SERVER['REQUEST_URI']; // /users/1?tab=info
$_SERVER['QUERY_STRING']; // tab=info
$_SERVER['HTTP_HOST']; // example.com
$_SERVER['HTTPS']; // 'on' なら HTTPS
$_SERVER['SERVER_NAME']; // example.com
$_SERVER['SERVER_PORT']; // 80 / 443
$_SERVER['REMOTE_ADDR']; // クライアント IP(プロキシ越しなら X-Forwarded-For 見る)
$_SERVER['HTTP_USER_AGENT']; // ブラウザ情報
$_SERVER['HTTP_REFERER']; // 直前のページ
$_SERVER['HTTP_ACCEPT_LANGUAGE']; // ja,en-US;q=0.7
$_SERVER['SCRIPT_NAME']; // /index.php
$_SERVER['PHP_SELF']; // /index.php/foo(注意: XSS の温床)
$_SERVER['DOCUMENT_ROOT']; // /var/www/html
$_SERVER['CONTENT_TYPE']; // application/json
$_SERVER['CONTENT_LENGTH']; // バイト数
// プロキシ / LB 越しの実 IP 取得(信用するヘッダはサーバ設定で決める)
function clientIp(): string {
return $_SERVER['HTTP_X_FORWARDED_FOR']
?? $_SERVER['HTTP_X_REAL_IP']
?? $_SERVER['REMOTE_ADDR']
?? 'unknown';
}
$_GET / $_POST: 外部入力のセキュリティ
外部入力は必ず: ① 存在チェック ② バリデーション ③ エスケープ。
<?php
// ✅ Null 合体演算子で安全に取得
$page = (int) ($_GET['page'] ?? 1);
$keyword = trim((string) ($_GET['q'] ?? ''));
// XSS 対策: HTML 出力時にエスケープ
echo '検索: ' . htmlspecialchars($keyword, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// SQL Injection 対策: prepared statement(必須)
$stmt = $pdo->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 経由で値を上書きされる脆弱性につながります:
<?php
// ❌ 推奨されない
$id = $_REQUEST['id']; // GET? POST? COOKIE? 不明
// ✅ 明示的に取得元を限定
$id = $_GET['id'] ?? null; // URL 経由
$id = $_POST['id'] ?? null; // フォーム経由
// php.ini で挙動制御(request_order)
// request_order = "GP" ← G:GET, P:POST, C:COOKIE
$_SESSION
<?php
session_start(); // 必ず先に呼ぶ(ヘッダ送信前)
// 値を保存
$_SESSION['user_id'] = 123;
$_SESSION['cart'] = ['p1', 'p2'];
// 取得
$userId = $_SESSION['user_id'] ?? null;
// 削除
unset($_SESSION['cart']);
// セッション破棄(ログアウト)
$_SESSION = [];
if (ini_get('session.use_cookies')) {
$p = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$p['path'], $p['domain'], $p['secure'], $p['httponly']);
}
session_destroy();
// セッション固定化対策(ログイン直後)
session_regenerate_id(true);
$_COOKIE と setcookie()
<?php
// 取得
$theme = $_COOKIE['theme'] ?? 'light';
// セット(ヘッダ送信前である必要あり)
setcookie('theme', 'dark', [
'expires' => time() + 86400 * 30,
'path' => '/',
'domain' => '.example.com',
'secure' => true, // HTTPS のみ
'httponly' => true, // JS から読めない
'samesite' => 'Lax', // CSRF 対策
]);
// 削除(過去時刻にセット)
setcookie('theme', '', time() - 3600, '/');
$_ENV と環境変数
<?php
// $_ENV は php.ini の variables_order に E が含まれる必要あり
// variables_order = "EGPCS"
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
// getenv() でも取得可能
$dbHost = getenv('DB_HOST');
// putenv() で実行時設定
putenv('DEBUG=1');
// .env ファイル運用は phpdotenv / Symfony Dotenv を使うのが定石
// Laravel: env('DB_HOST') / config('database.connections.mysql.host')
$GLOBALS
<?php
$counter = 0;
function inc(): void {
// global $counter; と書く代わりに
$GLOBALS['counter']++;
}
inc(); inc(); inc();
echo $counter; // 3
// ★ アンチパターン: グローバル変数依存は避ける(テスト困難)
// → 引数や DI で渡す設計が望ましい
Laravel の Request クラスとの違い
Laravel では生のスーパーグローバルを直接触る必要はほぼありません:
<?php
use Illuminate\Http\Request;
public function show(Request $request)
{
// GET / POST 一括取得(PHP の $_GET/$_POST 相当)
$id = $request->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 出力 | XSS | htmlspecialchars() |
| $_GET / $_POST を SQL に渡す | SQL Injection | prepared statement |
| $_GET / $_POST をシェル実行 | OS Command Injection | escapeshellarg() |
| $_FILES の type / name を信用 | RCE / 改ざん | サーバ側で再検証 |
| $_SERVER['PHP_SELF'] を直接出力 | XSS | SCRIPT_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-Type が application/json なら $_POST には入りません(php://input + json_decode で読む)。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?