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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1099閲覧

メールフォームのスパム対策について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2018/12/09 14:40

メールフォームを作成したのですが、
英語のURL付きの問い合わせメールが来るので、困っています。
できれば、javascriptで入力規則でチェックする方法はないかと考えいています。

フォームの構造について
・入力ページ、確認ページ、完了ページという作りです。
・バリデートは、validate.jsでチェックをしています。
・recaptchaを設置しています。

input.php

php

1 2<head> 3<script src='https://www.google.com/recaptcha/api.js'></script> 4<script src="../js/jquery-1.8.3.min.js"></script> 5<script src="../js/validate.js"></script> 6 7 8</head> 9 10 <form action="confirm.php" method="post"> 11 <dl> 12 <dt>会社名<span class="hissu">必須</span></dt> 13 <dd> 14 <input type="text" name="company" placeholder="" size="50" class="validate required" /> 15 </dd> 16 </dl> 17 <dl> 18 <dt>住所</dt> 19 <dd> 20 <input type="text" name="department" size="50" class="validate" /> 21 </dd> 22 </dl> 23 <dl> 24 <dt>ご担当者 氏名<span class="hissu">必須</span></dt> 25 <dd> 26 <input type="text" name="name" size="50" class="validate required" /> 27 </dd> 28 </dl> 29 <dl> 30 <dt>電話番号<span class="hissu">必須</span></dt> 31 <dd> 32 <input type="text" class="form-control validate number required" id="tel" name="tel" size="12" maxlength="12" value="" > 33 </dd> 34 </dl> 35 <dl> 36 <dt>メールアドレス<span class="hissu">必須</span></dt> 37 <dd> 38 <input type="text" value="" size="50" name="email" class="validate email required"/> 39 </dd> 40 </dl> 41 <dl> 42 <dt>メールアドレス(確認)<span class="hissu">必須</span></dt> 43 <dd> 44 <input type="text" value="" size="50" name="email_check" class="validate email email_check required"/> 45 </dd> 46 </dl> 47 <dl> 48 <dt>お問い合わせ内容<span class="hissu">必須</span></dt> 49 <dd> 50 <textarea id="message" name="content" rows="4" cols="40" class="validate required"></textarea> 51 </dd> 52 </dl> 53<p><div class="g-recaptcha required" data-sitekey="6LdEoX8UAAAAAHRMF6cT9Gmf-P7L-DNDOilHOMqx"></div></p> 54 <p class="center"> 55 <button class="button" type="submit"><span>同意し、確認画面へ</span></button> 56 </p> 57 </form>

confirm.php

php

1<?php 2 // フォームのボタンが押されたら 3 if ($_SERVER["REQUEST_METHOD"] == "POST") { 4 // フォームから送信されたデータを各変数に格納 5 $company = $_POST["company"]; 6 $department = $_POST["department"]; 7 $name = $_POST["name"]; 8 $email = $_POST["email"]; 9 $tel = $_POST["tel"]; 10 $content = $_POST["content"]; 11 } 12 13 // 送信ボタンが押されたら 14 if (isset($_POST["submit"])) { 15 // 送信ボタンが押された時に動作する処理をここに記述する 16 17 // 日本語をメールで送る場合のおまじない 18 mb_language("ja"); 19 mb_internal_encoding("UTF-8"); 20 // 件名を変数subjectに格納 21 $title = "お問い合わせのお知らせ"; 22 $cont = <<< EOM 23 24以下のお問い合わせをいただきました。 25 26=================================================== 27【 会社名 】 28{$company} 29 30【 住所 】 31{$department} 32 33【 ご担当者様 氏名 】 34{$name} 35 36【 電話番号 】 37{$tel} 38 39【 メール 】 40{$email} 41 42【 問い合わせ内容 】 43{$content} 44=================================================== 45 46EOM; 47 48 mb_send_mail("adress", $title, $cont, $header); 49 50 // 件名を変数subjectに格納 51 $subject = "[自動送信]お問い合わせ内容の確認"; 52 53 // メール本文を変数bodyに格納 54 $body = <<< EOM 55{$name} 様 56 57お問い合わせありがとうございます。 58以下のお問い合わせ内容を、メールにて確認させていただきました。 59 60=================================================== 61【 会社名 】 62{$company} 63 64【 住所 】 65{$department} 66 67【 ご担当者様 氏名 】 68{$name} 69 70【 電話番号 】 71{$tel} 72 73【 メール 】 74{$email} 75 76【 内容 】 77{$content} 78=================================================== 79 80内容を確認のうえ、回答させて頂きます。 81しばらくお待ちください。 82EOM; 83 84 // 送信元のメールアドレスを変数fromEmailに格納 85 $fromEmail = "アドレス"; 86 87 // 送信元の名前を変数fromNameに格納 88 $fromName = "dummy"; 89 90 // ヘッダ情報を変数headerに格納する 91 $header = "From: " .mb_encode_mimeheader($fromName) ."<{$fromEmail}>"; 92 93 // メール送信を行う 94 mb_send_mail($email, $subject, $body, $header); 95 96 // サンクスページに画面遷移させる 97 header("Location: thanks.php"); 98 exit; 99 } 100?> 101 102<!doctype html> 103<html> 104<head> 105<meta charset="utf-8"> 106<script src="../js/jquery-1.8.3.min.js"></script> 107 108</head> 109 110<body> 111 112 <form id="confirm" action="confirm.php" method="post"> 113 <input type="hidden" name="company" value="<?php echo $company; ?>"> 114 <input type="hidden" name="department" value="<?php echo $department; ?>"> 115 <input type="hidden" name="name" value="<?php echo $name; ?>"> 116 <input type="hidden" name="email" value="<?php echo $email; ?>"> 117 <input type="hidden" name="tel" value="<?php echo $tel; ?>"> 118 <input type="hidden" name="content" value="<?php echo $content; ?>"> 119 <p class="txt01">お問い合わせ内容はこちらで宜しいでしょうか?<br> 120 よろしければ「送信する」ボタンを押して下さい。</p> 121 <dl> 122 <dt> 123 <label>会社名</label> 124 </dt> 125 <dd><?php echo $company; ?></dd> 126 </dl> 127 <dl> 128 <dt> 129 <label>住所</label> 130 </dt> 131 <dd><?php echo $department; ?></dd> 132 </dl> 133 <dl> 134 <dt> 135 <label>ご担当者 氏名</label> 136 </dt> 137 <dd><?php echo $name; ?></dd> 138 </dl> 139 <dl> 140 <dt> 141 <label>電話番号</label> 142 </dt> 143 <dd><?php echo $tel; ?></dd> 144 </dl> 145 <dl> 146 <dt> 147 <label>メールアドレス</label> 148 </dt> 149 <dd><?php echo $email; ?></dd> 150 </dl> 151 <dl> 152 <dt> 153 <label>お問い合わせ内容</label> 154 </dt> 155 <dd><?php echo htmlspecialchars($content); ?></dd> 156 </dl> 157 <div class="btnBlock"> 158 <p class="btn02"><a class="button" value="内容を修正する" onclick="history.back(-1)"><span>内容を修正する</span></a></p> 159 160 <button class="button" type="submit" name="submit"><span>送信する</span></button> 161 </div> 162 </form> 163 164</body> 165</html>

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

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

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

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

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

guest

回答3

0

ベストアンサー

すごいな、$_POSTで受け取るデータを全く何も検証せず、
百発百中スパム送信に使えるね、これ。
昔のphp入門書に書いてあるようなコードだな。

$contentや$emailとか$nameとか、
こういう入力があったら遮断するっていう
フィルターすら実装していないとは。

mb_send_mail()にかけるまえに、
不適切な文言が含まれているかどうかを
PHP側で判定して遮断するべきですよ。

php

1<?php 2 3$content =<<<EOT 4_____ _______ 5 6_____________ __ ____________________________________________________________________________________________________________ 7 8_______________________MAX_____________________________________________________________________________________________________________________________________GET______ 9 10___________________ 11 12http://bit.ly/2h0gmah 13 14_________ROLEX_________________________________________ 15 16http://bit.ly/2xtv701 17EOT; 18 19if (preg_match('/bit.ly/', $content)) { 20 echo 'NG'; 21} else { 22 echo 'OK'; 23} 24

httpは許容するけど短縮URLは拒否するって場合なら
例えばこんなサンプルコードみたいにpreg_match()すればいいんじゃないかと。

また、自分とこの入力フォームを使って投稿されているかどうかを
検証するべきで、
PHPでCSRF対策の話 - Qiita
にあるような
《フォーム生成時にサーバからの認証用のtokenを埋め込み、リクエスト送信時に一緒にサーバに返し、正しいtokenが送られてきているか検証を行う。》
対策もご検討ください。
$_SERVER['HTTP_REFERER']を検証するよりも間違いないですし。
実装楽な事例:
とっても簡単なCSRF対策 - Qiita

投稿2018/12/10 01:01

編集2018/12/10 02:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/12/10 02:15

いっそ、Googleフォームにしちゃうのもいいのではないかと。
guest

0

できれば、javascriptで入力規則でチェックする方法はないかと考えいています。

JavaScriptでチェックするのは不適当です。JavaScriptはクライアントサイドで実行するものなので、攻撃者はJavaScriptを無視して、直接PHPにデータを投げつけられます。セキュリティ的な効果をもたせることはほぼできません。

投稿2018/12/09 22:42

maisumakun

総合スコア145121

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

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

0

受け取りメールの問題以前です
このコードでは、スパムの発射台として利用されるので、一旦お問い合わせフォームは使用を中止し、基礎から学習されたほうが良いかと。

投稿2018/12/09 15:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/12/10 02:14

言ってあげなきゃ、基礎もなにもわからないと思うよ。
退会済みユーザー

退会済みユーザー

2018/12/10 02:44

notice の無視はダメよ。ってところからなので、体系的に基礎から学ばないとダメかと。 言いたかったのは、「一旦お問い合わせフォームの使用を中止しましょう」ってことがメイン。英語の文章受け取ってるってことは、すでに発信されちゃってる可能性も高いので。 結構まずいことになっている自覚持ってほしいなぁ。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問