はじめに
実務で問い合わせフォームにいつからか大量のスパムが送られるようになり、どうにかならないかと相談を受けたため、色々調べて以下の簡易的な対策を実施することにしました。
スパムを送信するロジックについて
調べたところによると、スパムはbotを使用して、フォーム内のすべての項目に値を自動入力し、送信してくるケースが多いようです。
その特性を利用して、表示上見えないフォームを作成し、そのフォームに値が入っていたらスパムと判断(普通はフォームが見えず、値が入力できないため)し、404を返す形で実装します。こういった形は「Honeybot」と呼ばれるようです!
実装したコード
contact.blade.php
<form method="POST" action="{{ route('contact') }}">
@csrf
<div>
<h2>お問合せフォーム</h2>
<dl>
<dt>
<label for="name">氏名<span>必須</span></label>
</dt>
<dd>
<input type="text" class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}" name="name" id="name" placeholder="氏名" value="{{ old('name', '') }}" >
</dd>
// こちらを今回追加
<dd style="display:none;">
{{ Form::text('subject', '') }}
</dd>
</dl>
</div>
</form>
ContactController.php
if(isset($request['subject'])){
abort('404')
}
さいごに
今回こちらを実装したことで、実際にスパムが来なくなりました!
ちょっとした工夫が大切なんだなと勉強になりました。