PHP工房トップ

HOME > メールフォームにおける迷惑メール、スパムメール対策

メールフォームにおける迷惑メール、スパムメール対策

2018/7/28 追記(重要)
メールフォームプログラムのアップデートにより、スパム対策に非常に有効なワンタイムトークン機能を追加しました。そのため最新版を導入いただければ、かなりの高確率でスパムを遮断できると思います。(基本的な機能や設置法などは変わりませんので、すでに導入中の場合でも比較的簡単に差し替えできると思います)

2017/8/9 追記
禁止ワード設定によるスパム対策用のコードを公開しました。配布版のmail.phpにコピペするだけでOKです。
簡易版ではありますが無償でご利用いただけます。ほとんどのスパムは対処出来ると考えています。

スパムメール(迷惑メール)対策用PHPコード

はじめに

一昔前はサイト内に直接メールアドレスを記述し、mailto:でメーラーを立ち上げさせて問い合わせてもらうということが横行しましたが、今ではほとんど見られなくなりました(たまーに見かけますが・・)

ご存知のかたが大半かと思いますが、これは非常にまずいですね。。
メールアドレス収集ロボットによりメールアドレスがスパム送信者のリストに載ってしまいます。
そうなると大量のスパムが届くことになります。厄介なのが一度載ってしまうと当然削除されるということは基本的には永久にありません。ですので絶対にやってはいけないことであると言えます。

現在ではほとんどの場合、お問い合わせにはサーバーサイドのフォームプログラムが使われるようになりました。 当サイトで配布しているようなメールフォームプログラムもPHPで作られたサーバーサイドのフォームプログラムです。

メールアドレスがプログラムファイル内にのみ記述されますので、Web上には公開されることはありません。ので収集されることも基本的にはありません。

それでも100%スパムを防ぐことは困難です。フォームから送信してしまえばできてしまいますので。
当サイトで配布しているプログラムを今まで相当数使用し、また様々なお問い合わせをいただいてきた経験上、スパムは週に1度あるかどうかのレベルが大半だと思っています。これはもちろんサイトによっても異なります。また使い方によっても異なるかと思います。

また結局は頻度の問題でもあります。たとえば1日に10通も20通もそれ以上来るようでは多いと言えます。
が、月に1~2通程度であれば無視できるレベルですよね。

ここでいうスパムとはフォーム経由で届いたメールを指します。
メールアドレスに直接届くメールに対しては、なんら対処できませんのでご了承下さい。
フォームからのメールの場合、決まったフォーマットで届くと思いますので判断は付くと思います。

あくまでも100%防げる方法ではありませんが、また、その他の方法もあるかもしれません。
ただ誰かのお役に立てれば幸いです。

基本的な対策法

ポイントはスパム送信者の「手間」を増やし、出来る限り自動化できないような対策が有効です。
ただ、もっと重要な事は問い合わせる「一般ユーザーの負担にならないように」が肝心です。問い合わせが減ってしまっては元も子もありません。

プログラム側で行っている対策

1,メールアドレスの形式チェック (ヘッダ改竄による大量送信防止なども含む)
2,htmlspecialcharsによる入力されたHTMLタグの無効化
3,スパムとはあまり関係がないかもしれませんが、NULLバイト除去。

まず確認画面はあったほうが良いでしょう。

デフォルトではONとなっています。
理由としてはスパム送信者の「手間」を増やすことができる点にあります。どの程度の抑止力になるかどうかは未知ですが、「やらないよりは良い」と思います。が、必須ではありません。。。

必須設定を行う(PHP側で)

※当サイトのプログラムに付いていますが、デフォルトはOFFになっています。

必須設定を行わなければ送信ボタンを押しただけで送信できてしまいます。= 手間がない
昨今ではJavascriptで必須チェックを行うことも多いですが、これはあくまでも一般ユーザー向けであるという認識が必要です。スパム送信者がJavascript機能の付いたものを使っているとは考えにくいからです。
JavascriptをOFFにしてしまえば簡単に無効化できますので。

「併用」がベストですが、とにかく最終的に必須チェックはPHP側(サーバーサイド側)で行うことが重要なポイントです。

だからと言ってすべての項目を必須にすることは絶対に避けましょう。
必要最小限に留めるべきです。たとえばちょっと問い合わせたいだけなのに、電話番号や住所まで必須になっていると引いちゃいますよね。

もちろんこのあたりは業種や問い合わせの種類によっては有りですので、一概には言いません。
とにかく必要最小限であることが求められるのは確かです。

「スパム防止のためのリファラチェック」をONに

※当サイトのプログラムに付いていますが、デフォルトはOFFになっています。(「必須設定」にて設定下さい)

「リファラ」とは直前に見ていたページ(遷移前のページ、リンク元などとも言います)のURLを指します。
オプションとしていますが、出来る限りONにすることを推奨します。
これは何をチェックしているかというと、メールフォームからメールフォームプログラムに入力データが送られますが、この最初のメールフォームのURL(正確にはドメイン)が設定したドメインと同じかどうかをチェックします。

ですのでここにはメールフォームを設置したサイトのドメインを指定下さい。

たとえば、外部のサイトからformタグで
<form action="http://www.○○○/mail.php" method=post">
としてしまえば送信できてしまうからです。(action属性の値には絶対パスも指定できてしまうから)
要するにどこからでも送信が可能になってしまうからです。※ローカルのパソコンからでも送信できてしまいます。

※リファラは偽装することも可能ですが、そこまでして送信される可能性は低いと考えています。
※すると思いますが設定したら必ず送信テストを行って下さい。ドメインが間違っている等の場合には、確認画面でエラー表示となりますのですぐに気づきます。

完了ページを用意しリダイレクトさせる

※当サイトのプログラムに付いていますが、デフォルトはOFFになっています。
スパム対策とは直接関係が無いかもしれませんが、デフォルトの完了画面の場合、ブラウザの更新ボタンでフォームデータを再送信できてしまい、結果連続で送信できてしまいます。
完了ページ(サンクスページ)はなんでも良いので用意し、完了時にはそちらを表示するようにして下さい。
※htmlファイルでもphpファイルでもなんでもOKです。適当に「ありがとうございます」等を書いたページを作ってアップ下さい。
プログラム(mail.php)内でリダイレクトのON,OFF及びリダイレクト先のURLを指定するだけです。
ファイル内のコメントを参考に設定下さい。

それでもスパムが届く場合の対処法

経験上、上記だけでほとんどの場合、対処できることが多いと思います。
世にあるフリーのプログラムはこれらが無いことがあるため、スパムが届きやすいとも考えています。
が、それでもスパムが来る場合には以下の導入をご検討下さい。

禁止ワード設定による対策

2017/8/9 追記
禁止ワード設定によるスパム対策用のコードを公開しました。配布版のmail.phpにコピペするだけでOKです。
簡易版ではありますが無償でご利用いただけます。ほとんどのスパムは対処出来ると考えています。

スパムメール(迷惑メール)対策用PHPコード

 

スパムメールを確認してみるとある共通点があるのが分かるかと思います。(すべての状況での保障はありませんが)

経験上、ほとんどのスパムでは本文内(textarea)に<a href="○○ のようにリンクタグがあります。
また当然リンク先のURLも記述されています。
※当プログラムはすべてテキスト形式で送信するため、htmlタグなどは無効化されタグはそのまま表示されます。

通常このプログラムはテキスト形式での送信となりますので、htmlタグが書かれることはあり得ません。
そこで、このリンクタグが含まれていたら送信できないようなものを実装すれば防ぐことができます。

当サイトの有料版「禁止ワード、禁止IP設定付き」であれば禁止ワードにこのhtmlタグを指定できますので、送信自体を無効化できます。(禁止ワードにたとえば「<a href=」と指定すればOKになります。またはURLが入力されることが無い場合には「http」などでも良いかもしれません)
なんだか誘導しているようで恐縮ですが、そのつもりはまったくありません。あくまでも必要があれば検討下さい。

トークンによる対策

リファラチェックの強力版と考えて良いかと思います。
フォームページ側でランダムな文字列を生成し、それをセッションに保存。さらにその生成したランダムな文字列をinputタグのhidden要素でプログラム側に渡し、確認画面時にhiddenで送られてきた文字列とセッション内の文字列とをマッチングし、一致した場合のみ送信させるという仕組みを言います。
これでちゃんとフォームページを経由した正規ユーザーであるかどうかを判断できます。
(もちろんこのあたりをクリアするスパム送信が無いとも限りませんが)

これの欠点としてはトークンを発行するためフォームページ側にもPHPを実装する必要があり、かつ拡張子が.phpである必要があります。
(ajaxで送る方法もありますが、後述する理由により現実不可)
ただ、そもそもPHPのセッション機能はブラウザのクッキーを使いますが、ガラケーが対応していないなどの問題もあり、配布版には実装していません。

こちらの実装を希望の場合にはカスタマイズとして承ることは可能ですのでご検討下さい。(4,000円程度)

画像認証(キャプチャ認証)による対策

ここまで来ると最終兵器というか最後の手段だと思います。
一度は見たことがあるかと思いますが、画像でランダムな文字列を表示させ、それをユーザーに入力してもらうものです。

過去に一度だけ納品した実績はありますが、ほとんどの場合、ここまでの必要は無いことが多いと思います。
なによりもこれのデメリットはユーザーに負担がかかるという点がありますので最後の手段であると考えています。

ただ、その効果はその他とは比較にならないほどと考えられます。一般的なサイトであればほぼパーフェクトに近い対策になるとか思います。(超大手のサイトの場合にはその限りではありませんが)

こちらも実装をご希望の場合には有償でのカスタマイズとなりますのでご了承下さい。(4,000円程度)

決まった日本語を入力させる

一概には言えませんが、スパムのほとんどは外国語圏からが多いと思いますので、あえて決まった日本語を入力させる方法です。画像認証の簡易版でしょうかね。
ただ、当然外国人が英語でお問い合わせする可能性がある場合には却下ですね。

「日本人」と入力下さい

入力欄のタグは以下のようになっています。
<input name="認証文字" type="text" size="40" />

これでmail.php側に以下記述を追記すればOKです。
場所は適当な上の方であればOKです。「必須設定」の上あたりで良いです。

これで問題なく動作しますが、あくまでこれは簡易版です。エラーの場合にはなにもせず強制終了させるものです。確認画面で表示するようなものではなく、戻るボタンもありませんのでご了承下さい。
また確認画面、及び送信メール内にもこの「認証文字」が表示されます。
使用はご自身の責任において行って下さい。
もちろんこういったカスタマイズを承ることは可能ですのでご検討下さい。

PHPメールフォーム(無料版)

PHPメールフォーム(有料版)

新着情報・更新履歴CMS(無料版)

投票・アンケートシステム(無料版)

テロップCMS(無料版)

写真ギャラリーCMS(無料版)

営業日カレンダーCMS(無料版)

営業日カレンダーCMS(有料版)

カレンダー予約フォーム(無料版)

カレンダー予約フォーム(有料版)

リンク集ページCMS(無料版)

アクセスカウンター(無料版)

ダウンロードカウンター(無料版)

その他

メールフォームの各種カスタマイズならお任せ下さい
業務効率化が可能なPHPオリジナルCMS制作します

役立つかも?なもの

豆知識や役立ち事など

PHPについて

各種情報