14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】お問い合わせフォームに簡易なスパム対策をサクッと実装する

Last updated at Posted at 2021-05-06

やりたいこと

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

↑こんな感じのごく一般的なお問い合わせフォーム

どんなロジックで対策するか?

・スパムを送りつけてくるのは主にスパム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ページに遷移するのが確認できると思います。


以上、最後までお読みいただきありがとうございました。

14
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?