質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

8628閲覧

PHPメールフォームでのセキュリティについて(input type="hidden")

omori3

総合スコア274

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

5クリップ

投稿2019/04/09 09:19

HTMLとPHPでメールフォームの作成を考えています。

ページ遷移に付きましては、古典的な「入力」→「確認画面ページ」→「完了ページ」想定です。

今回のフォームは下記のコード以外にもまぁまぁな個人情報を含みます。
確認画面<input type='hidden' value='<?php echo(htmlspecialchars($_POST['name'])); ?>'>のようにhiddenを使って実際の送信データにもっていくのはセキュリティ的に危険でしょうか?
危険な場合どのような対策を施せばよろしいでしょうか?

その他メールフォーム周りに関する注意点ありましたらご享受いただけたら幸いです。

HTML

1<form action='../confirm/' method="POST" class='form'> 2 <label> 3 <p class='cate'>お名前</p> 4 <input type='text' name='name'> 5 </label> 6 <label> 7 <p class='cate'>フリガナ</p> 8 <input type='text' name='name_kana'> 9 </label> 10 <label> 11 <p class='cate'>電話番号(ハイフンなし)</p> 12 <input type='tel' name='tel'> 13 </label> 14 <label> 15 <p class='cate'>メールアドレス</p> 16       <input type='mail' name='mail'> 17 </label> 18</form>

php

1<form action='../finished/' method="POST" class='form'> 2 <label> 3 <p class='cate'>お名前</p> 4 <p class='inputs'><?php echo(htmlspecialchars($_POST["name"]));?></p> 5 <input type='text' name='name' value='<?php echo(htmlspecialchars($_POST["name"]));?>' hidden> 6 </label> 7 <label> 8 <p class='cate'>フリガナ</p> 9 <p class='inputs'><?php echo(htmlspecialchars($_POST["name_kana"]));?></p> 10 <input type='text' name='name_kana' value='<?php echo(htmlspecialchars($_POST["name_kana"]));?>' hidden> 11 </label> 12 <label> 13 <p class='cate'>電話番号(ハイフンなし)</p> 14 <p class='inputs'>?php echo(htmlspecialchars($_POST["tel"]);?></p> 15 <input type='tel' name='tel' value='<?php echo(htmlspecialchars($_POST["tel"]);?>' hidden> 16 </label> 17 <label> 18 <p class='cate'>メールアドレス</p> 19 <p class='inputs'><?php echo(htmlspecialchars($_POST["mail"]);?></p> 20 <input type='mail' name='mail' value='<?php echo(htmlspecialchars($_POST["mail"]);?>' hidden> 21 </label> 22</form>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

確認画面<input type='hidden' value='<?php echo(htmlspecialchars($_POST['name'])); ?>'>のようにhiddenを使って実際の送信データにもっていくのはセキュリティ的に危険でしょうか?

正確には正しい返しではないですがいいえ
それで危険とは言い切れません。
なぜならブラウザデベロッパツールからhtmlは改ざん可能なので、hiddenをtextと変えることもできるからです。
hiddenにしたからとセキュリティが高まるわけではなく、かといって低くなるわけでもありません。

「個人情報を含む」というのでしたら、むしろ通信部分の暗号化が必須なので
サイト全体のSSL化されているかどうかのほうが大事です。

現在はSSL化されていないサイトはブラウザからセキュリティの警告がでるようになっていますから、
長くメンテナンスされていないサイトや社内利用のみに限定されたWebアプリケーションを除いては
サイト全体が常時SSL化されていると思って過言ではないです。

いずれにしても入力データを何かしらで持ちまわることに変わりはありません。
セッションに入れて持ちまわるやり方もありますが、hiddenよりは良いとは思います。

あとは一般的なWebアプリケーションの対策を地道に施していくことでしょうか。

攻撃手法を認識しておくことでどのような対策が必要でどのような効果があるのかを分かりますし、
テストもきちんとできると思います。

ただ、やってはいけないのは「PHP メールフォーム」で検索して上位から確認していく行為です。

それならQiitaでストック数や評価数が多い記事を参考にしたほうがまだ全然良いです。

メールフォームであれば単に画面でのデータの受け渡しだけではなく、メール送信自体にも気を配る必要がありますので、そのあたりもきっちり身に着けていく必要があると思います。

※この辺りは思わぬ脆弱性を盛り込んで思わぬところで知らない誰かやグループに多大な迷惑をかけてしまうということを認識して取り組む必要があります。
私もこれについては大変幅広い知識が必要であり、全て把握できているわけではありません。
様々な情報を収集し、ときには書籍を読み、何度も検証し、万全を期する必要があります。

結局のところ

何を以て「セキュリティリスクとするか」は仕様です。
開発者側できちんと線引きをする必要があります。

これは学校の校則とかと似ていて、厳しすぎると利用者が窮屈になるし、
緩すぎると標的になりやすくなります。
結構ここは、プロジェクト毎に揉めるところではあります。

投稿2019/04/09 09:37

編集2019/04/09 10:06
m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omori3

2019/04/09 10:23

ご回答ありがとうございます。 とても参考になりました。 SSLは導入予定なので良かったです。 セッション使うにせよデータ持ち回ることには変わりないので安心ではないということですね。 もう一方のアンサーも良かったですが、 『PHP メールフォーム』の上位10件が勝率10%のリンクがとても興味深くなるほどなぁと思ったのでベストアンサーにさせてもらいます。
m.ts10806

2019/04/09 10:26

理解が進んだようで何よりです。 「結局のところ」を追記してます。体系的に学んだあとは「どこまで盛り込むか」を決めてください
guest

0

初回にPOSTしている値でもあるので、hiddenで引っ張り回しても問題無いとされる範囲としてしまって良いと思います。
(sessionで引き回すのもありです)

それよりは

  • HTTPSでフォームを運用する
  • CSRF対策を確実に行う
  • 確認ページをキャッシュさせない

等と言った事の方が重要です。

セキュリティについて全部を説明するのは不可能なので

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 を読んで学習されることをお勧めします。

投稿2019/04/09 09:36

編集2019/04/09 09:47
tanat

総合スコア18709

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omori3

2019/04/09 10:25

ご回答ありがとうございます。 とても参考になりました。 セッションについても調べてみます。 具体的に3つアドバイスかつ参考文献ありがとうございます。 ベストアンサーにしたい気持ち山々ですが、今回はもう一方にしたいと思います。何卒ご理解いただけると幸いです。
guest

0

PHPメールフォームでのセキュリティについて(input type="hidden")

タイトルに関して回答します。
画面遷移時のデータ引き継ぎとして、post + hidden を使用することの直接的なセキュリティリスクはありません。

データの引き継ぎ方法として、バリデーション要件でセッションの利用を選択するケースが多いですが、セキュリティ的な観点での選択ではないです。

コードに関してはすでに他の方も回答されていますが、基本的なところから学習されることが必須です。
また、メールフォームとして必要な機能設計も出来ていないようなので、メールフォームに対しての攻撃手法の洗い出しから行ってみるのが良いかと思います。

*学習用途ではなく、実務用途であるのであれば、自作フォームより google フォームを推します。

参考
外部に公開されたメールフォームは、匿名掲示板と似ています。
以下を学習の足がかりにしてみると良いです。
【PHP初心者向け】セキュアな掲示板を最小構成から作る

上記にない機能要件として必須なのは以下です。
・バリデーション
・連続投稿の抑止
・メールシステム固有のセキュリティ対策(メールヘッダに関するものや、メールアドレスの正当性確認等)

実務用途のメールフォームは初学者には非常にハードルが高いです。
失敗したときのリスクもでかいです。送付に使用したドメインが死にます。
また、サンプルもがさつなものが多いので、基本を理解してから利用することをオススメします。

投稿2019/04/09 10:53

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問