概要
先日、Railsで開発した個人ブログを公開しました。
その公開に伴いGoogleのサーチコンソールに登録したは良いものの、問い合わせフォームに、RichardcenceさんやGeorgewetさんなど知らない外国人から「登録したら〇〇ドルもらえる!」というスパムが大量に届いたため、その対策として行ったことを簡単にまとめます。
1. URLのバリデーション
早急にbot等でのスパムメールを送れないようにするため、まず初めに問い合わせフォームの本文にURLのバリデーションを設定しました。
## URLの正規表現を生成して定数へ
VARID_URL_REGEX = /\A#{URI::DEFAULT_PARSER.make_regexp(%w(http https))}\z/
## 上記の正規表現が含まれていたらNG
validates :message, presence: true,
format: { without: VARID_URL_REGEX }
このバリデーションだけで恐らく大半のスパムbotは送れなくなると思います。(自身のサイトで企業案件などを募集している方はURLが入力できなくなるのでご注意ください。)
2. googleのreCAPTCHA
加えて自分の場合は、botからの送信対策として、googleのreCAPTCHAを導入しました。
※reCAPTCHAとは、ユーザー登録等で、信号とかバスとか選択させられたり、自分がロボットか否か確認させられたりするやつです。参考:WHAT IS RECAPTCHA?
実装はpikawakaさんのサイトを参考に行いました。
今回の実装の注意点として、
- シークレットキーとサイトキーの発行
自分のサイトの場合、ユーザーからの問い合わせを円滑にするため、v2非表示(サイトの右下に利用規約が表示されるタイプです)を利用しました。その際、サイトキーとシークレットキーが発行されますが、非表示とチェックボックスを切り替える際にキーを発行し直す必要があります。
- 環境変数の設定
上記で発行した各キーを読み込むために、.envファイルもしくはcredentialへの記載が必要です。
自分はcredentialを用いて、config/initializers下に以下のコードを記載しました。
※設定の詳細は割愛しますが、開発/本番環境で用いるcredentials.ymlも編集しています。
Recaptcha.configure do |config|
config.site_key = Rails.application.credentials.recaptcha[:site_key]
config.secret_key = Rails.application.credentials.recaptcha[:secret_key]
end
- submitボタンをreCAPTCHAの非表示用のタグに変更
非表示のreCAPTCHAを用いる場合は、通常のform_withなどで用いるsubmitボタンのタグをinvisible_recaptcha_tagsに変更する必要があります。
<%= invisible_recaptcha_tags({ text: "送信", class: "btn btn-success w-25" }) %>
以上を行うと、フォームの送信時にbotかどうか、確認してくれるようになります。
まとめ
上記を行ったことで、1日最大で300件近く届いていたスパムメールが0になりました!
(サイト自体の訪問者も少ないので、問い合わせ自体が0になりました…)
スパムで困っている方の少しでも力になれれば幸いです。
また、編集リクエストなどあれば、気軽にコメント/リクエストください。
ここまでお読みいただきありがとうございました。
完全な宣伝です
以下の個人ブログを運営しています。
サイトに関しての意見や共通の趣味がある方からの連絡、その他諸々大歓迎です。(スパムはご遠慮ください笑)
ぜひ気軽にサイトまでお越しください。