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

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

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

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

Q&A

解決済

1回答

3133閲覧

コンタクトフォームのポートフォリオ作成

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2017/07/23 09:00

こちらのサイト
http://www.kanda-it-school.com/sample/php/seminar/php_seminar_sample_code/index.php
を参考に、ひとまず簡単なコンタクトフォームのポートフォリオを作成し、
下記のコードを軽く動作させました。
そこでまず4つの疑問が出ましたので、助言をいただきたいです。

###・メールアドレス等を正規表現でチェックをいれたほうがいい?
上記の通りです。
###・空メールか、その他何かしらの嫌がらせができるかもしれない
今更こんな嫌がらせがあるのかどうか疑問ですが、必要なら対策方法を教えていただきたいです。
###・send.phpの送信元メールアドレス変換等に違和感あり
send.phpのコメントにしているあたりで、問い合わせ発信者の方に
わざわざメールアドレスを返すことと、問い合わせされた方に返すメールのはずなのに$nameでなく、$fromEmailを作って「お問い合わせテスト」を設定する意味が分かりません。
ぼくの解釈がおかしいのでしょうか?アドバイスをください。
###・send_done.phpの内容確認に、横幅を指定したい
ひたすら縦横いっぱいになるくらいコピペで文字を入力したら、
ブラウザの縦横比を動かすとその横幅を目一杯使って見た目が崩れてしまいます。
textareaのmax/min指定のようなことをする方法を教えていただきたいです。

contact.php

<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Contact form</title> </head> <body> <style type="text/css"> button.button8{ -moz-border-radius:8px; -webkit-border-radius:8px; border-radius:8px; } input.textbox { -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; width:300px; } TEXTAREA { -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; min-width: 300px; max-width:400px; min-height:200px; max-height:300px; } </style> <form action="send.php" method="post"> Name:<br /><input type="text" class="textbox" name="name" placeholder="お名前"><br /> Address:<br /><input type="text" class="textbox" name="address" placeholder="メールアドレス"><br /> Inquiry:<br /><TEXTAREA placeholder="お問合せ内容" name="inquiry"></TEXTAREA><br /> <button class="button8">送信</button> </form> <?php ?> </body> </html>

send.php

<?php if($_SERVER["REQUEST_METHOD"]=="POST") { $name=$_POST["name"]; $address=$_POST["address"]; $inquiry=$_POST["inquiry"]; } if(isset($_POST["submit"])) { mb_language("ja"); mb_internal_encoding("UTF-8"); } if(isset($_POST["submit"])){ mb_language("ja"); mb_internal_encoding("UTF-8"); $subject="[自動返信]お問い合わせ内容の確認"; $body=<<<EOM {$name}様 お問い合わせありがとうございます。 以下のお問い合わせ内容の確認メールをお送りしました。 =============================================== 【お名前】 {$name} 【内容】 {$inquiry} =============================================== 内容を確認の上回答させていただきますので、 しばらくお待ちください。 EOM; $fromEmail="example.com";//送信元のメールアドレス変換? $fromName="お問い合わせテスト";//送信元の名前を変換 $header="From:".mb_encode_mimeheader($fromName)."<{$fromEmail}>"; mb_send_mail($address,$subject,$body,$header); header("Location:send_done.php"); exit; } ?> <style type="text/css"> input,button{ -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; } </style> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ContactForm</title> </head> <body> <div><h1>CompanyName</h1></div> <!-- <div><h2>お問い合わせ</h2></div> --> <form action="send_done.php" method="post"> <input type="hidden" name="name" value="<?php echo $name; ?>"> <input type="hidden" name="address" value="<?php echo $address?>"> <input type="hidden" name="inquiry" value="<?php echo $inquiry; ?>"> <h1 class="contact-title">お問い合わせ内容確認</h1> <p>お問い合わせ内容はこちらでよろしいでしょうか?<br> よろしければ送信ボタンを押してください。</p> <div> <div> <label>お名前</label> <p><?php echo $name; ?></p> </div> <div> <label>メールアドレス</label> <p><?php echo $address?></p> </div> <div> <label>内容</label> <p><?php echo nl2br($inquiry); ?></p><!-- ? --> </div> </div> <input type="button" value="修正" onclick="history.back(-1)"> <button type="submit" name="submit">送信</button> </form> </body> </html>

send_done.php

<style type="text/css"> button{ -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; } </style> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ContactForm</title> </head> <body> <div><h1>CompanyName</h1></div> <div> <h1 class="contact-title">お問い合わせ送信完了</h1> <p> お問い合わせありがとうございました。<br> 内容を確認の上回答させていただきます。<br> しばらくお待ちください。 </p> <a href="contact.php"> <button type="button">お問い合わせに戻る</button> </a> </div> </div> <body> </html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

入門書にあるようなサンプルは、セキュリティ要件を考慮したコードになっていることはほぼないので、実用性を求めてはいけません。

コンタクトフォームに求められる代表的なセキュリティ機能は、

・外部からの投稿対策
・連続送信制限
・送信/エラーログ

になると思いますが、これらの要件化/実装はそこそこスキルを必要とします。
逆説的ですが、実装方法をある程度想定できなければ、要件化できないのでいろいろ経験してみないと難しいです。
上記のような機能が実装されていないシステムでは、以下のような被害が想定されます。

・特定アドレスに対して大量の「受け付けました」メールを飛ばす
・大量の宛先不明メールを発送され、使用ドメインをSPAMドメインとされる
・サーバリソースを借りている場合、送信メール数の上限張り付きになり、事実上メールフォームが機能しない

実用性を排した条件で、質問内容に触れると

・メールアドレス等を正規表現でチェックをいれたほうがいい?
入力値の確認は行ったほうが良いですが、メールアドレスの正規表現での確認は至難です。
やるなら【参考】そろそろメールアドレスを正規表現だけでチェックするのは終わりにしませんか?辺りを参考に、簡略化するのがオトナな対応だと思います。

・空メールか、その他何かしらの嫌がらせができるかもしれない
あるかどうかよりも、あった時の影響範囲を検討すべきです。
すでに記述しましたが、ワリと大きい影響を与えます。

・send.phpの送信元メールアドレス変換等に違和感あり
質問の意図がよく分かりません。from を設定しなくても良いのではないかという問いですか?

・send_done.phpの内容確認に、横幅を指定したい
こちらは質問を分けたほうが良いです。
質問の本質がまるで違うので。

投稿2017/07/23 09:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/07/23 10:03

send.phpの違和感はまず、「送信者情報の確認をするなら、今回の場合 $fromEmail=$address,$fromName=$nameとするのが普通なのではないか?」 という事です。(それでも、$from○○に書き換える必要性がわかりません) それに、送信元の方に文面で確認ができれば、データを渡す必要性が感じられません。 データのやり取りにセキュリティ対策をしていないわけですし・・・。 (セキュリティ対策してない前提なのでする必要ない話かもしれませんが)
退会済みユーザー

退会済みユーザー

2017/07/23 10:17

問い合わせた方のメールアドレスと名前を from にセットすべきだと言ってます? 今だとほとんど届かないんじゃないかなぁ。。。
退会済みユーザー

退会済みユーザー

2017/07/23 10:24

はい、その通りです。元のソースを見て、今お聞きしてる部分だけ意図が読み取れなかったので・・・。 そもそも、どういう意図で書き込まれたコードなのでしょうか?
退会済みユーザー

退会済みユーザー

2017/07/23 10:28

send.php の以下の箇所であってますよね? $fromEmail="example.com";//運営者のアドレス $fromName="お問い合わせテスト";//運営者の名前 $header="From:".mb_encode_mimeheader($fromName)."<{$fromEmail}>"; from にサイト運営者の情報をセットしているって理解していますか?
退会済みユーザー

退会済みユーザー

2017/07/23 10:34

運営者情報であっていたのですか? だとしたら、ソースコード内の解説コメントを読み違えていました、 申し訳ないです・・・。 参考にしたサイトでは // 送信元のメールアドレスを変数fromEmailに格納 $fromEmail = "contact@dream-php-seminar.com"; // 送信元の名前を変数fromNameに格納 $fromName = "お問い合わせテスト"; // ヘッダ情報を変数headerに格納する $header = "From: " .mb_encode_mimeheader($fromName) ."<{$fromEmail}>"; // メール送信を行う mb_send_mail($email, $subject, $body, $header); // サンクスページに画面遷移させる header("Location: http://testapp.hippy.jp/contact/thanks.php"); exit; (一部略) となっていたので、「送信元」が問い合わせ送信者でなくサイト運営者に状況が変わっていた という事なのでしょうか。
退会済みユーザー

退会済みユーザー

2017/07/23 10:42

役割(?)を誤解しているよう気がします。 送信しているのは、サイトであり、サイト運営者です。 問い合わせしている人は、サイトのコンタクトフォームを使用して、「[自動返信]お問い合わせ内容の確認」を受信する、受信者です。 この辺の理解がズレていないですか?
退会済みユーザー

退会済みユーザー

2017/07/23 10:54

理解が反対だったようです・・・。 send.phpは「ポストを受け取る」「自動返信メールを作る」「send_done.phpに送る」プログラムだったんですね。自動返信メールを作る時は、「問い合わせ送信者=受信者」「サイト運営側=送信元」なんですね。 まずプログラムの読み解きしっかりできるようにします、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問