やりたいこと
・必要事項を入力するとメールが送られるお問い合わせフォームを設置したが、スパムメールがたくさん来る。
・完璧じゃなくて良いので、スパム対策をあまり手をかけずにサクッと実装したい。

どんなロジックで対策するか?
・スパムを送りつけてくるのは主にスパムbotと呼ばれるもの。
・このbotは、フォーム内のすべての項目に自動的に入力して送信してくることが多い。
この特性を利用し、まずViewのformタグの中に「非表示の項目」を作り、そこに入力がある場合はスパムと判断し404に飛ばす処理をします。いわゆる簡易なHoneypot保護機能です。
実装手順
①Viewの実装
まずはViewのフォーム部分に隠し項目を追加します。名前は適当にhoneypot
としていますが、何でも良いです。
今回はFormファサードを使用していますが、htmlのformタグの場合はhidden属性で入力項目を追加します。
_contact_form.blade.php
<div id="anchor-contact" class="p-front__contact">
<h3 class="p-front__contact-heading">下記のフォームよりお問い合わせください</h3>
{{ Form::open(['method' => 'POST', 'url' => route('common.send')]) }}
〜中略〜
{{ Form::text('honeypot', '', ['style' => 'display:none']) }}
<div class="c-button" data-type="contact">
<button type="submit" class="check-button">この内容で送信する</button>
</div>
</form>
</div>
②Controllerの実装
次に、送られてきたリクエストに上記のhoneypot
の値があった場合は404に飛ばす処理を追加します。
commonController.php
public function send(CommonRequest $request)
{
if (isset($request->honeypot)) {
abort(404);
}
〜後略〜
..と、これだけなのですが以上で実装は完了です。
ディベロッパーツールで隠し項目に適当な項目を入力して送信してみると、404ページに遷移するのが確認できると思います。
以上、最後までお読みいただきありがとうございました。