【問い合わせフォーム】攻撃の手口と対策
2021.03.30
WEBの世界は、様々な人達と繋がり情報を伝達できる世界です。
とても便利で、なくてはならないものとなっています。
しかし、その反面常に悪用しようとしている者もいます。
最近は、他人のサイトの問い合わせフォームを悪用し、他者に攻撃を仕掛ける手口が広まってきています。
攻撃を仕掛けられた方はもちろん、問い合わせフォームを悪用された方にも被害が出る場合があり非常に悪質です。
今回は、その問い合わせフォームを利用した攻撃について解説し、対策案を挙げたいと思います。
問い合わせフォームを利用した攻撃とは
何故、問い合わせフォームが狙われるのか
まず、問い合わせフォームが狙われる理由について説明します。
それは、問い合わせフォームがメールを送信するからです。
よく使われる、Gメール等のメールシステムは迷惑メールの検知の制度が格段に向上しています。
その為、普通にスパムメールを送付したのでは迷惑メール扱いとなり効果がない場合が多くなってきました。
その対策を突破する為に、問い合わせフォームから「問い合わせ受付完了メール」が送付される事が多い点を利用されました。
「問い合わせ受付完了メール」は問い合わせフォームがあるサイトのメールアドレスで送付される為、迷惑メールとして扱われないのです。
問い合わせフォームが狙われる理由
- スパムメールが迷惑メールとしで識別されるようになった。
- 問い合わせフォームは受付完了メールを送付する。
- 他人のメールでスパムメールを送付する事ができる。
問い合わせフォームを利用した攻撃の手口
- 問い合わせを行った際に受付完了メールが送付される問い合わせフォームを見つける。
- 問い合わせフォームにあるメールアドレスの欄にスパムメールを送付したい相手のメールアドレスを記入する。
- 備考等の自由記入欄にスパムメールで送付したかった内容を記載する。
- 問い合わせを行う。
上記のような行動をプログラム等で繰り返す事により、多数のスパムメールを偽装して送付されます。
この手口の場合、実際にブラウザから問い合わせを行わなくてもプログラムで何度も問い合わせフォームに対して
スパムメール送付をさせることができる場合があり非常に悪質です。
どのような被害がでるのか
スパムメールは、フィッシングサイトへのリンクやスパイウエアの含まれるサイトのリンク等が含まれている事が多く犯罪に利用される場合もあります。
送付されるメールにそのようなリンクが含まれるとなれば、運営しているサイトの信用を失ってしまいます。
更に、問い合わせが届いたことを知らせるメールを送付している場合は、攻撃に使用された問い合わせが多数届きます。
その為、正規の問い合わせが埋もれてしまう等の被害も出ます。
問い合わせフォームを利用した攻撃の対策
問い合わせフォームを利用した攻撃を防ぐにはどうしたら良いでしょうか?
WordPressのContact Form 7プラグインを利用している場合
Contact Form 7のプラグインを使用している場合はGoogleが提供している「reCAPTCHA」で認証をかけると良いでしょう。
一般的にロボットチェック等と言われる仕組みで、プログラムで何度も問い合わせフォームを実行させないようにする仕組みとなります。
Google reCAPTCHAの公式からreCAPTCHAのキーを取得し
Contact Form 7のインテグレーションから設定するだけで設定できる為簡単です。
WordPressのMW WP formプラグインを利用している場合
reCAPTCHAのキーを取得するまではContact Form 7と同じ手順です。
MW WP formはその後、MW WP form reCAPTCHAという別のプラグインを導入しreCAPTCHAのキーを設定すれば完了となります。
PHPを使って作成している場合
問い合わせフォームを直接PHP等で作成されている方も多いと思います。
自分でGoogle reCAPTCHAを導入するのはハードルが高いと感じる方も多いのではないでしょうか?
その場合、以下のコードをフォームに仕込む事でフォームの不正利用を止められる場合があります。
フォーム側PHPコード
<?php
date_default_timezone_set('Asia/Tokyo');
$today = date("Y-m-d H:i:s");
$key = 'XXXXXXXXXX'; //任意のパスワードを設定
$code = openssl_encrypt($today, 'AES-128-ECB', $key);
?>
<input type="hidden" name="check" value="<?php echo $code; ?>"/>
フォーム受け側PHPコード
<?php
date_default_timezone_set('Asia/Tokyo');
$key = 'XXXXXXXXXX'; //送信側で設定した任意のパスワード
$code = openssl_decrypt($_POST['code'], 'AES-128-ECB', $key);
$today = date("Y-m-d H:i:s");
$before_today = date("Y-m-d H:i:s",strtotime("-1 hour"));
if(strtotime($code) < strtotime($before_today)
|| strtotime($code) > strtotime($today)){
// 送られてきたコードの日付が1時間前より古いもしくは、現在よりも未来の場合終了
exit();
}
こちらのコードはそれぞれ、フォーム送信の際に暗号化した日付を隠し項目として送付します。
フォームの内容を受けた場合、メール送付前に受けっ取った暗号化した日付を復号化し現在時刻と比較します。
時間が一時間以内の場合だけメールを送付するようにする事で、プログラムでフォーム内容をコピーして使用しても
1時間で使用できなくなるという仕組みです。
攻撃を仕掛けている側も何度もプログラムを修正しなければならない場合、ターゲットを別のフォームに移すかもしれません。
Google フォームに移行する
フォームを自分のサイトに持っている場合、どうしてもXSS(クロスサイトスクリプティング)等に気を配らなければならず
よくわからない為、煩わしいと思われる方も居ると思います。
その場合、問い合わせフォーム部分をGoogle フォームにしてしまっても良いかもしれません。
セキュリティ周りをGoogleが管理してくれている為、知識がなくても大丈夫なので安心です。
その場合、問い合わせフォーム部分のみURLが変わってしまう点に注意が必要です。
関連