【PHP初心者向け】GETとPOSTの違いは「年賀状」と「現金書留」だ!丸見えのリスク

GETとPOST webシステム

GETかPOSTか、気分で決めていませんか。

Webサイトで「送信」ボタンを押した瞬間、あなたの入力したデータは旅に出ます。

その旅のスタイルには、2つの種類があります。
「GET」と「POST」です。

もしあなたがこの2つを適当に選んでいるとしたら、あなたは今すぐ本記事を熟読すべきです。

使い分けを間違えることは、セキュリティ上の自殺行為に等しいからです。

今日はこの2つの通信方式を、郵便物に例えて完全に理解していただきます。


GET:中身丸見えの「年賀状」

GET送信は、データを「URLの後ろ」にくっつけて送る方式です。

Googleで検索した時のURLを見てください。
「search?q=猫」のような文字がついていますよね?これがGETです。

これは、郵便で言えば「年賀状(ハガキ)」のようなものです。
宛名(URL)のすぐ横に、通信内容が書いてある。
配達員(プロバイダやサーバー管理者)は、その内容を読み放題です。

もしあなたが、パスワードである「123456」をGETで送ったらどうなるか。
URL欄にpassword=123456と表示されます。

後ろに立っている上司にも、ブラウザの履歴を見た家族にも、通信ログを見たエンジニアにも、あなたのパスワードは筒抜けです。

  • メリット(ブックマークできる)
    URLに情報が含まれているので、「猫の検索結果」を保存したり、友人にLINEで送ったりできます。
  • デメリット(丸見え)
    機密情報の送信には絶対に使えません。
  • デメリット(量に限界がある)
    ハガキのスペースが限られているように、送れる文字数に制限があります。

POST:厳重に封をした「現金書留」

対するPOST送信は、データを「通信のボディ(内部)」に隠して送る方式です。
URLには何も表示されません。

これは「現金書留」や「厚手の封筒」です。

宛名(URL)だけが見えていて、中身は封筒の中に隠蔽されています。
配達員も中身を見ることはできません(基本的には)。

パスワードやクレジットカード番号、長文のブログ記事などを送るときは、GETではなく必ずこちらを使います。

  • メリット(隠蔽性)
    URLに表示されないため、覗き見されにくい。
  • メリット(大容量)
    封筒なので、分厚いデータや画像ファイルも送れます。
  • デメリット(ブックマークできない)
    URLに情報が含まれていないため、そのページを保存しても「入力画面」に戻されるだけです。
  • デメリット(再送信の警告)
    ブラウザの「戻る」ボタンを押すと、「フォーム再送信の確認」というウザい警告が出ます。

PHPでの受け取り方:専用の箱が用意されている

PHP側では、送られてきた方式に合わせて、データを受け取るための「特別な箱(連想配列)」があらかじめ用意されています。

初心者の方で、「連想配列の理解に自信が無いな…」と言う方は、ぜひ以下の記事を読んでみてください。

【PHP初心者向け】連想配列は「名札付きロッカー」だ!番号管理からの解放と矢印の正体
配列の「0番目」というルールにうんざりしていませんか。連想配列なら「ラベル」でデータを管理できます。矢印(=>)を使って、意味のあるデータ構造を作る方法を解説します。

GETやPOSTで送信するデータを入れる配列を自分で作る必要はありません。PHPが勝手に用意してくれています。

GETで送られてきた場合

$_GETという連想配列に入っています。

// URLが「index.php?name=田中」の場合
echo $_GET["name"]; // 結果:田中Code language: PHP (php)

POSTで送られてきた場合

$_POSTという連想配列に入っています。

// フォームからPOSTで送信された場合
echo $_POST["email"]; // メールアドレスが表示されるCode language: PHP (php)

名前がそのままなので、間違えようがありません(しかし、筆者は誤って$POSTと書き、POSTデータがなぜ入っていないんだとパニックになったことがあります)。

GETで送ったのに $_POST の箱を探しても、中身は空っぽです。逆もまた然りです。


使い分け:検索はGET、秘密はPOST

どっちを使えばいいのか迷ったら、以下の基準で判断してください。

  • そのページを誰かにシェアしたいか?
    Yes → GET(検索結果、商品ページなど)
    No → POST(ログイン処理、会員登録、決済など)
  • データを見られてもいいか?
    Yes → GET
    No → POST(パスワード、個人情報)
  • データがサーバーの状態を変えるか?
    Yes(書き込み、削除、注文)→ POST
    No(見るだけ)→ GET

特に3番目が重要です。
GETは「取ってくる(Get)」ためのもの。
POSTは「投函する(Post)」ためのものです。

何かを注文したり、データベースを書き換える処理をGETで作ってはいけません。
URLを叩いただけで注文が確定したりデータが変わったりするようなシステムは、事故の温床です。


まとめ:恥ずかしい、バレたくないデータは封筒に入れるべし

GET:ハガキ。URLにくっつく。シェアできるが丸見え。
POST:封筒。内部に隠れる。見えないし大容量。

あなたの送ろうとしているデータが「挨拶」ならハガキ(GET)で構いません。

しかし、「愛の告白」や「借金の相談」なら、迷わず封筒(POST)に入れてください。

Webの世界でも、デリカシーとセキュリティは同義です。

コメント

タイトルとURLをコピーしました