PHPのhiddenフィールドとは?初心者でもわかる使い方とセキュリティ対策をやさしく解説!
生徒
「PHPでフォームを作ってるときに、hiddenっていう項目を見たんですけど、これは何に使うんですか?」
先生
「それは、画面には表示されないけど、データとして送信するための入力項目なんだよ。」
生徒
「え、表示されないのに使うんですか?それって安全なんですか?」
先生
「うん、それが大事なポイントなんだ。便利だけど注意しないとセキュリティのリスクもあるんだよ。一緒に見ていこう!」
1. hiddenフィールドとは?画面に表示しないけど送信される情報
PHPやHTMLでフォームを作成する際、ユーザーの目には触れさせたくないけれど、プログラムの処理上どうしてもサーバーへ送る必要があるデータが出てきます。そんな時に役立つのが、input type="hidden"、通称「hidden(ヒドゥン)フィールド」です。
「hidden = 隠された」という意味の通り、ブラウザの画面上には何も表示されません。しかし、送信ボタンが押された瞬間、テキストボックスに入力された文字などと一緒に、こっそりと指定した値をサーバーへ届けてくれる便利な仕組みです。
* 商品の注文ページで「どの商品を選んだか」という商品IDを送る時
* アンケートフォームで「どのページから来たか」という情報を記録する時
* 編集画面で「どのデータを更新するか」という識別番号を保持する時
まずは、プログラミングが初めての方でもイメージしやすい、最もシンプルなHTMLの例を見てみましょう。
<form action="confirm.php" method="post">
<input type="hidden" name="product_id" value="12345">
<input type="hidden" name="shop_code" value="S001">
<p>「購入する」ボタンを押すと、商品ID(12345)が送信されます。</p>
<input type="submit" value="購入する">
</form>
このコードをブラウザで開くと、見えるのは「購入する」というボタンと説明文だけです。しかし、ボタンをクリックすると、PHP側では以下のようにデータを受け取ることができます。
// 送られてきたデータをPHPで受け取る例
$id = $_POST['product_id'];
$shop = $_POST['shop_code'];
echo "商品ID:" . $id . "(ショップコード:" . $shop . ")の注文を受け付けました。";
このように、hiddenフィールドを使えば、ユーザーにわざわざ入力してもらう必要のない「システム用の管理番号」などを、スマートに受け渡すことができるようになります。
2. hiddenフィールドが使われる具体例とメリット
「具体的にどんな場面で使うの?」という疑問にお答えするために、Webサイトでよく見かける3つの代表的な活用シーンを紹介します。hiddenフィールドは、ユーザーに意識させずに「裏側でバトンを渡す」ような役割を持っています。
商品一覧から「カートに入れる」ボタンを押した際、どの商品(ID)をいくつ送るかを指定します。
ブログの投稿などを修正する際、「どの記事を書き換えるか」という識別番号を保持するために使います。
入力画面→確認画面→完了画面と進む中で、前の画面で入力した内容を次の処理へ受け渡します。
それでは、プログラミング未経験の方でもイメージしやすいように、ネットショップの「注文ボタン」を例にしたHTMLコードを見てみましょう。
<form action="cart.php" method="post">
<input type="hidden" name="item_id" value="A1001">
<input type="hidden" name="quantity" value="1">
<p>人気商品「PHP入門テキスト」をカートに入れますか?</p>
<input type="submit" value="カートに入れる">
</form>
このコードのポイントは、input type="hidden"と書かれた行が2つあることです。ブラウザで見ると何も表示されませんが、ユーザーが「カートに入れる」ボタンをクリックした瞬間、item_id(商品番号)とquantity(数量)がセットでcart.phpというプログラムに送られます。
もし、これらをhiddenフィールドを使わずに普通の入力ボックス(type="text")で作ってしまうと、ユーザーが間違えて商品番号を書き換えてしまい、別の商品が届くといったトラブルが起きてしまいます。ユーザーに触らせたくない、かつ画面をスッキリさせたい場合に、このhiddenフィールドが非常に役立つのです。
3. でも注意!hiddenフィールドは誰でも見えるし変更できる
ここで大事な注意点です。hiddenフィールドは「画面に表示されない」だけで、パソコンに詳しい人なら簡単に中身を見ることができて、値を変更することもできます。
たとえば、上の例のquantityを「1000」に変えて送信すれば、1000個の注文をサーバーに送れてしまうのです。
これはセキュリティの問題になります。
Google Chromeなどのブラウザで「検証ツール(けんしょうツール)」を使えば、HTMLの中身はすぐに見れてしまいます。
4. PHPでhiddenフィールドの値を信用しないことが重要
サーバー側(PHPのプログラム側)では、hiddenフィールドの値をそのまま信用してはいけません。なぜなら、ユーザーが値を勝手に変更しているかもしれないからです。
たとえば、商品の価格や割引情報などをhiddenフィールドで送って、それをPHP側でそのまま使ってしまうと、不正注文が可能になってしまいます。
安全にするためには、サーバー側で「この値は本当に正しいか?」を確認する処理が必要です。
5. セッションやデータベースで確認しよう
安全にするには、hiddenフィールドに商品IDだけを入れておき、PHP側でその商品IDに対応する正しい価格や情報を、データベースから読み込んで処理する方法がおすすめです。
session_start();
$product_id = $_POST['product_id'];
// データベースから価格などを取得(ここでは仮の関数)
$product_info = getProductFromDB($product_id);
$price = $product_info['price'];
このようにすれば、ユーザーがhiddenの値を変更しても意味がなくなり、セキュリティも高まります。
6. ワンタイムトークンで不正送信を防ぐ
さらにセキュリティを強化するために、「ワンタイムトークン(トークン:使い捨てのカギ)」をhiddenフィールドに入れて、サーバー側でチェックする方法もよく使われます。
これにより、他人が勝手にフォームを真似して送っても、正しく処理されません。
例えば、ログイン中のユーザー専用のトークンをセッションに保存しておき、フォーム送信時に一致するかどうかを確認します。
7. hiddenフィールドは便利だが、使い方を間違えると危険
まとめると、PHPのhiddenフィールドは、ユーザーに見せずにデータを送信したいときに便利な機能です。
でも、パソコンに詳しい人なら中身を見たり変更したりできるので、セキュリティ対策をしないと危険です。
サーバー側で正しいかどうかを確認したり、ワンタイムトークンで不正送信を防いだりすることが大切です。
まとめ
PHPでフォームを扱うときに重要になるhiddenフィールドは、画面には表示されないにもかかわらず、サーバーへ確実にデータを送信できる便利な仕組みです。商品IDやユーザー識別番号のように、ユーザーに触れさせたくない情報を自然に送れるため、ショッピングサイトや予約フォームなど幅広い場面で活用されています。 しかし、このhiddenフィールドはあくまで「見えないだけ」であって、「安全なもの」ではありません。ブラウザの検証ツールを使えばすぐに値を変更できてしまうため、PHP側でその値を鵜呑みにすると不正注文や情報改ざんといった問題を引き起こします。 そのため、hiddenフィールドを使うときには、必ずサーバー側でデータの正しさを確認する仕組みが必要になります。商品情報をデータベースから再取得したり、セッションと照らし合わせて正当性を確かめたりするのが基本です。さらに、一度きりのワンタイムトークンを使えば、外部から偽造されたフォーム送信も防止できます。 初心者のうちは、hiddenフィールドをただ便利だからと適当に使ってしまいがちですが、正しい使い方を理解することで、安全性の高いPHPフォームを作れるようになります。特にショッピングカート、ユーザー情報管理、予約システムなどの開発では必須の考え方になるため、この段階でしっかり身につけておくことが将来のスキルアップにもつながります。
hiddenフィールドを使った安全なサンプルコード
以下は、hiddenフィールドとセッションを併用して安全性を高める例です。
<form action="check.php" method="post">
<input type="hidden" name="product_id" value="A2005">
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>">
<button type="submit">確認画面へ進む</button>
</form>
サーバー側では、トークンが一致するかどうかを必ずチェックします。
session_start();
if ($_POST['token'] !== $_SESSION['token']) {
die("不正なアクセスです。");
}
$product_id = $_POST['product_id'];
$product = getProductInfoFromDB($product_id);
このようにhiddenフィールド単体ではなく、必ずPHPのセッションやデータベースと組み合わせることで、安全な入力フォームが実現できます。 フォーム送信というと見た目のHTMLに意識が向きがちですが、裏側のチェックこそがWebアプリケーションの安定性を支える重要な要素です。hiddenフィールドは便利な反面、扱い方を誤ると危険が伴うため、今回学んだポイントをしっかり押さえて活用していきましょう。
生徒
「hiddenってただの見えない項目だと思ってたんですが、もっと奥が深かったんですね……。値が見られるし変更できるっていうのは驚きです。」
先生
「そうだね。見えないから安全だと考える人は多いけれど、実際はHTMLの一部だから簡単に書き換えられてしまうんだ。だからPHP側でのチェックが大事なんだよ。」
生徒
「ワンタイムトークンっていう仕組みも便利ですね。偽造の送信を防げるなんて、まるで秘密鍵みたいです。」
先生
「まさにそう。hiddenフィールド、セッション、トークン、この三つを組み合わせると、初歩のPHPでもかなり安全なフォームが作れるようになるよ。」
生徒
「今日の内容で、フォームのセキュリティがどれだけ重要かよく分かりました!これからは設計の段階でしっかり考えるようにします!」
先生
「うん、その意識がとても大事だよ。安全なフォームを作れるようになれば、PHPでできることはどんどん広がっていくからね。」