お問合せページのスパム・迷惑メール対策

スパムメール

スパム対策の必要性

前回の記事でお問合せページの作り方をご説明しました。


お問合せ
お問合せページの作り方

サイト運営時に必要になる事の多いお問合せページの作り方


会社等で運営しているWEBサイトであれば、『電話番号』などを記載する事で、1つの連絡手段を設ける事ができますが、個人で運営する場合は『電話番号』を記載するのは難しいものです。

『メールアドレス』を記載すれば、簡単に連絡を取る手段を作成する事が出来ますが、スパムメール送信者に簡単にアドレスを取得されてしまう恐れがあり、大量のスパムメールを送りつけられる可能性も高いため、おすすめできません。

その点、『お問合せ窓口』を設ければ、メールアドレスを公開する事なく、気軽に連絡できる連絡手段を設ける事が可能です。

しかし、『お問合せ窓口』であっても、『スパム対策』を行わなければ、毎日大量のスパムメールが届くようになる可能性があり、様々な問題を引き起こす可能性があるとお話しました。

スパムメールによる問題

メール処理が大変になる

ウィルスに感染する可能性

毎日たくさんのスパムメールが届くと、必要なメールと不要なメールを判断し、処理していく作業が発生してしまいます。

誤って、スパムメールを開いてしまうと、最悪の場合ウィルスに感染してしまったり、不信なサイトを開いてしまったりと大きな問題が発生してしまう可能性もあります。

完全にスパムを排除するのは難しいですが、お問合せ窓口からのスパムメールは、直接『人』が送っているもの以外に、『bot』と呼ばれるロボットが自動で送信している場合も非常に多いため、『bot』への対策は導入された方が良いかと思います。

今回は、いくつかの対策方法をご紹介したいと思います。

オリジナルのスパム対策

お問合せ窓口からのスパムメール対策としては、この後ご紹介する、『確認画面を作る』『入力必須項目を作る』『Google reCAPTCHAを設置する』『IP制限をかける』などの方法が一般的です。

それらの手段は非常に有効な手段ですが、ある程度の手間がかかるのも事実です。

前回の記事でご紹介した『phpコード』に数行加えるだけで、簡単に一部のスパムメールを除外する事もできるので、試してみてはいかがでしょうか。

自分で色々工夫するのもおもしろいかもしれません。

当サイトで、自分流で記述したスパム対策をご紹介したいと思います。

私のサイトのお問合せ窓口から送られて来るスパムメールの大半(ほぼ100%)は英語表記で送られて来ます。

逆に正規のお問合せは『日本語』で送られて来ます。

私のサイトは、基本的に日本語で記述し、日本人向けの記事を書いているため、日本語を含む問合せのみ受付するようにしました。

全角文字が無いものをはじく

1つ目の方法として、『全角文字』がお問合せ内容に含まれていない場合は、お問合せメールを自身へ送信しないようにする方法があります。

$toiawasenaiyo = 【この変数に問い合わせ内容を入れる】;
    
if(strlen($toiawasenaiyo) == mb_strlen($toiawasenaiyo,'utf8'))
{
    // 半角文字しかなかった場合の処理
}

strlen($XXX)

引数にした文字列のバイト数を取得する関数です。

例えば、バイト数は以下のようになります。

  • stren('abc') ⇒ 3
  • stren('アイウ') ⇒ 3
  • stren('アイウ') ⇒ 6
  • stren('あいう') ⇒ 6

『日本語』で問合せを行えば、ほぼ間違いなく『2バイトの全角文字』が文章内に含まれるはずです。

逆に英語で記述された問合せであれば、『1バイトの半角英数字』のみになる可能性が高いです。

mb_strlen($XXX, encoding)

引数にした文字列の文字数を取得する関数です。

  • mb_strlen('abc', 'utf8') ⇒ 3
  • mb_strlen('アイウ', 'utf8') ⇒ 3
  • mb_strlen('アイウ', 'utf8') ⇒ 3
  • mb_strlen('あいう', 'utf8') ⇒ 3

という結果が返ってきます。

つまり、『バイト数 = 文字数』となれば、日本語が使われていない文章とみなす事が可能です。

デメリットとしては、『英語での問合せがはじかれる』という点、『中国語』や『韓国語』、『全角英数字』、『全角記号』などを使われた際は、この対策をすり抜けてメールが送られてしまうという点です。

私のサイトには、『中国語』や『韓国語』の問合せメールは届いた事はありませんが、英語表記内に全角記号が使われている事は何度かありました。

そのため、

$toiawasenaiyo = 【この変数に問い合わせ内容を入れる】;

if(strlen($toiawasenaiyo) < (mb_strlen($toiawasenaiyo,'utf8') + 5))
{
    // 2バイト文字が6文字以上使われていない場合の処理
}

と改良し、2バイト文字が6文字以上使われていない場合、問合せをはじくように書き換えました。

こうする事で、問合せ窓口からのスパムメールはほとんど届かなくなりました。

全角文字が無いものをはじく

日本語で問合せを行えば、『ひらがな』が確実に文章内に入ってくるかと思います。

そこで、『ひらがなが入っていない問合せははじく』ようプログラムします。

$toiawasenaiyo = 【この変数に問い合わせ内容を入れる】;

if(!preg_match('/[あ-ん]+/u', $toiawasenaiyo))
{
    // ひらがなが入っていない場合の処理
}

先ほどのバイト数と文字数を比較する処理と合わせて使えば、かなりの確率で英字表記のスパムを除外する事が可能です。

私のサイトでこの処理を入れてからは1通もスパムメールは届いていません。

日本語表記のボットを使ったメールが届くようになれば、もちろんこの対策は意味をなしませんのでご注意下さい。

確認画面設置によるスパム対策

問合せメールを自身に送る前に、『確認画面』をはさむ事で、bot対策になる場合があります。

先ほどもお話したように、必ずしも『人』が直接操作して問合せ窓口から連絡しているわけではなく、『bot』が自動でお問合せから連絡している場合があります。

そのため、1画面で簡潔する場合は、入力項目を設定し送信ボタンを押す動作を行う事ができても、確認画面が存在すると再度送信ボタンを押す動作が必要になるため、自動のbotでは対応できない可能性が出てくるため、スパム対策になる可能性があるのです。

確認画面を設ける際は、セッション変数の使い方を学習しなければならない点が難点です。

前回の記事でご紹介した方法は、formタグで囲った中に入力欄を設置し、php側で入力情報を取得し自身のアドレスへその内容を送信しました。

しかし、確認画面を設けた場合、確認画面から再度、ユーザーに送信ボタンを押された際にメールを送信するphpファイルに入力内容を送信しなければならず、入力欄がない確認ページからphpファイルへ同じ方法で入力内容を送信する事ができません。

(ユーザーには見えない隠しフィールドを作る事で同じ方法で送信する事も可能ですがセッション変数の利用をおすすめします)

また、確認画面から『修正』ボタンなどを押して前の入力画面に戻った際は、前回入力された内容を入力欄に表示する機能も実装しなければいけません。

さらに、確認画面で入力された内容を表示する際、不正なスクリプトを埋め込まれないよう対策も行わなければいけません。

上記の理由から初めてphpをさわる方には敷居が高くなり、説明やソースが長くなってしまうため、またの機会に別記事でご紹介したいと思います。

Google reCAPTCHAを設置する

01reCAPTCHAとは

reCAPTCHA(リキャプチャ)は、お問合せ窓口などのWEBフォームに設置し、botなどからの悪質なアクセスを防ぎ、WEBサイトを守るための機能です。

『読みにくく崩して表示された文字』(OCRが読み取れない文字)の画像を入力し、ロボットではなく人がアクセスしている事を証明したり、『私はロボットではありません』というチェックボックスにチェックを入れるなどの操作を行った事のある方も多いと思います。

ユーザー側には手間がかかりますが、サイトの製作者側にとっては、悪質なボットによる不正アクセスを防ぐための有効な手段となります。

02reCAPTCHAのバージョン

reCAPTCHA(リキャプチャ)にはバージョンがあります。

初期バージョン『v1』

初期バージョンの『v1』は、『読みにくく崩して表示された文字』(OCRが読み取れない文字)の画像をユーザーが読み、その文字を入力する方式です。

崩した文字をボットが読み込めるようになり、それに伴い文字が複雑化していき、人間も文字を読みづらくなってしまったため、現在は提供が『終了』しています。

『v2』

次のバージョンである『v2』には3種類の形式があります。

『私はロボットではありません』というチェックボックスにチェックを入れる『checkbox』形式がまず1つです。

チェックボックスにチェックを入れるという動作の必要がない『Invisible』が2つ目の形式です。

もう一つは、Androidアプリに組み込むタイプの『Android』です。

文字内容を入力する『v1』に比べると手間は減りましたが、botの可能性が疑われる際は、『画像選択』画面が表示され、関連する画像を一覧の中から選ぶなどの作業が必要になってしまいます。

中のロジックがどのようになっているかはわかりませんが、私も何度か『画像選択』をしなければいけない事になった経験があります。

『v3』

『v2』も健在ですが、次に登場したバージョン『v3』では、文字の入力やチェックを入れる作業は必要なく、スコア判定によってbotを除外します。

botを除外するというよりは、スコア(点数)が返ってくるため、その点数によって『処理を行う・行わない』を自身のサイトの処理で決定、実行する自由度の高い形式です。

03reCAPTCHA『v2 Invisible』と『v3』の違い

『v2』より後に登場した『v3』の方が最新・高機能と思われるかもしれませんが、内容はそうではありません。

『v2 Invisible』と『v3』のユーザー側から見た見た目は同じですが、裏で行っている事は全く違います。

『v2 Invisible』はbotを除外する事が目的であり、botの可能性がある際は、画像選択画面を表示し、botでないか確認し、botの場合は送信をさせません。

それに対し、『v3』の場合は、スコアを返すだけで、botの判別や処理は自分で行う必要があります。

そのため、相手がbotの場合でも、送信は行われ、自身のサイト内で以後の処理を行うというのが大きな違いです。

確かに『v3』の方が自由度は高いですが、自分で処理を組み込む必要があるため、『お問合せ窓口』などでただbotを除外したいのであれば、『v2』を使う方が簡単で良いのではないでしょうか。

『v3』は『v2』の進化版というわけではなく、用途によって使い分けるという認識が正しいかと思います。

04reCAPTCHAの利用料

reCAPTCHAの『v2』『v3』は基本的に無料で利用する事ができます。

Google reCAPTCHA 公式ページにも掲載されているように、1月最大100万回の評価が無料です。

100万回を越える際は、『許可を取得する』か、『reCAPTCHA Enterprise』プランの利用を検討しましょう。

実際の導入方法に関しては、別記事で開設していきたいと思います。

IP制限をかける

最後にご紹介する方法は、IP制限をかける方法です。

一言でIP制限と言ってもその対処方法はいくつかあります。

01海外IPに制限をかける

まず、botは海外からのものが多い事から、『海外IP』にアクセス制限をかける事でbotを撃退する事ができます。

設定が簡単な反面、例えば以下のような『デメリット』も存在します。

  • 海外在住の方からの問合せを受付ける事ができない
  • 海外サーバー経由の正規botのアクセスを許可する必要性がある
  • IPアドレスは国をまたいで再振分けされるため日々更新が必要

海外在住の方からの問合せを受付ける事ができない

海外からのアクセスを遮断するため、当然海外の方からのアクセスまで制限されてしまいます。

その中には当然、海外にいる日本人の方も含まれるため、お問合せ窓口しか連絡手段を設置していなかった場合、ユーザーの方と連絡を取る手段が無くなってしまいます。

海外サーバー経由の正規botのアクセスを許可する必要性がある

例えば、各ブラウザ(Google、FireFoxなど)のbotもサイトを訪れるため、それらのアクセスまで遮断してしまうと大変な事になってしまいます。

また、『SearchConsole』などのサイト分析ツールを使っている場合や、海外のサイトチェックツールなどを使う場合も例外的にアクセスを許可する必要があります。

IPアドレスは国をまたいで再振分けされるため日々更新が必要

日本国内向けのIPアドレスは日々変動します

そのため、一回設定してしまえば終わりではなく、定期的に国内IPリストを更新する必要があります。

IPアドレスは国をまたいで再振分けされる事もあるため、特に注意が必要です。


以上のデメリットから、正直あまりおすすめできない方法です。

小さな個人ブログなどでは、簡単に設定できるため、この方法を取るのも1つの手ですが、公のサイトや大規模サイトではあまりおすすめできる方法ではありません。

訪問者が国内在住者に限られる限定的なサイトでの利用が好ましいかもしれません。

海外IPをブロックする方法

海外からのアクセスをブロックするためには、『.htaccess』を使います。

### 検索エンジンを後程まとめて許可するための環境変数設定
SetEnvIf User-Agent "Googlebot" allowbot
SetEnvIf User-Agent "msnbot" allowbot
SetEnvIf User-Agent "bingbot" allowbot
SetEnvIf User-Agent "Slurp" allowbot
SetEnvIf User-Agent "letsencrypt" allowbot

### ①全てのアクセスを拒否する
order deny,allow
deny from all

### ②検索エンジンからのアクセスを許可する
allow from env=allowbot

### ③SearchConsoleからのアクセスを許可する(使用していない際は不要)
allow from googlebot.com
allow from google.com

### ④日本国内IPからのアクセスを許可する(要確認・要更新)
allow from 1.0.16.0/20
allow from 1.0.64.0/18
allow from 1.1.64.0/18

(途中省略)

allow from 223.223.224.0/19
allow from 223.252.64.0/19
allow from 223.252.112.0/20

基本的な流れは、『全てのアクセスを拒否』 ⇒ 『検索エンジンを許可』 ⇒ 『自身が使うサービスからのアクセスを許可』 ⇒ 『日本国内のIPアドレスを許可』といった流れになります。

自身のサイトで利用しているサービス』と『日本国内に割り振られたIP』は、サイト、時期によって異なるため、変更が必要になります。

日本国内に割り振られたIPアドレスは、cgis.bizさんのサイトがリスト化してくれているため、そちらを使わせていただくと簡単かと思います。

02特定IPに制限をかける

もう1つの方法は、『特定のIPアドレス』からのアクセスを遮断する方法です。

サーバーのアクセスログなどを見れば、問合せ窓口から送られてきたスパム行為を行った相手のIPアドレスを調べる事が可能です。

頻繁に特定のIPアドレスから問合せメールを送りつけてくるなど、『犯人がわかっている場合』にのみ使える手法であり、事前にガードする使い方ではありません。

相手方がIPアドレスを変えて送ってくる再はいたちごっことなり、対応する事も難しくなってしまいますが、他の対策をすり抜ける相手に使うなどの方法で使うと良いかと思います。

特定IPをブロックする方法

先ほどの海外からのアクセスをブロックする際は、『全てのアクセスを拒否』 ⇒ 『特定のアクセスを許可』という流れで設定を行いました。

特定のIPアドレスをブロックする際は、『全てのアクセスを許可』 ⇒ 『特定のアドレスを拒否』という流れが一般的です。

こちらも『.htaccess』を使ってIP制限をかける方法です。

### ①全てのアクセスを許可する
Order allow,deny
allow from all

### ②特定のアクセスを拒否する
deny from xxx.xx.xxx.xxx(IPアドレス)
deny from .jun-jun.net(ドメイン)

上記のように、『IPアドレス』や『ドメイン』を指定してアクセスをブロックする事が可能です。

IPアドレスは、『グローバルIPアドレス』を記載します。

記事作成日:2021.07.20