【Django】お問い合わせフォームにreCAPTCHAを導入してスパム対策

ここ数日、ポートフォリオのお問い合わせフォームから、地味にスパムが飛んでくるので迷惑していました。

ということで、reCAPTCHAを入れて対策してみました。



reCAPTCHAとは?

reCAPTCHAとは、コメントやフォームを送信する際に、人間かボットか判定するための仕組みです。

よく見るのは「この中から信号機の画像を選んでください」みたいなやつです(あれ地味に難しいよね)。

reCAPTCHAにはv2とv3という2種があります。
大きな違いは、怪しい人を通すかどうか、という点です。

v2は怪しければ、画像認証クイズを出して、その段階で弾いてしまうのですが、
v3はとりあえず全員通して挙動を見てみて、「こいつ人間っぽいかスコア」を算出して、足切りを行うのです。

v3だと、人間なのにボットと間違われた衆生を救済できるよう、全メッセージを一旦スパムフォルダにためてチェックする、などの手順が必要になり、ちょっと面倒なんですね。

ということで、今回はv2で実装してみることにしました。



実装手順

今回は、django-recaptchaを使ってサクッと実装しました。


1. 登録

Google reCAPTCHAのサイトに必要情報を登録します。

Google reCAPTCHA登録画面

ラベルはわかりやすい名前を好きにつけましょう。

reCAPTCHAタイプは、先述の通りv2します。

ドメインに、reCAPTCHAを導入したいサイトのドメイン名を入れます。
ドメイン名なので、https...などの余計な部分は入れないでください。

例えば、私の場合、ポートフォリオサイトなので、kageori.pythonanywhere.comですね。
テスト環境でやりたい場合、127.0.0.1などと設定しておけばOKです。

すると、秘密鍵と公開鍵が発行されます。

Google reCAPTCHAキーの確認
上が公開鍵、下が秘密鍵


ちなみに、この画面を一旦閉じた後にもう一回確認したい場合、reCAPTCHAの画面右上の設定をクリックし、reCAPTCHA のキーというタブを開くと見られます。

Google reCAPTCHA設定画面
右上の歯車マークですね


2. Djangoのsettings.pyに値を追記

INSTALLED_APPSに、'captcha'を追加し、RECAPTCHA_PUBLIC_KEY(上図のサイトキー)とRECAPTCHA_PRIVATE_KEY(上図のシークレットキー)を追加します(この通りの名前で設定しないといけないみたい)。

値をベタ書きでもOKですが、私はenvファイルから読み込むようにしているのでこんな感じに。


3. forms.pyの修正

1行目のReCaptchaFieldのimportと、最後の行のcaptcha = ReCaptchaField()を追記しました。

ReCaptchaField()と書くだけで、ReCaptchaV2Checkboxがデフォルトで設定されるみたいです。
v3などの他の種類のものを設定したい場合、captcha = ReCaptchaField(widget=ReCaptchaV3) のように書くようです。


4. 完成

これだけで、最低限のところは動きます!
もう少し詳しく知りたい方は、django-recaptchaの公式ドキュメントをご覧ください。
Google reCAPTCHAを導入したサイト



まとめ

django-recaptchaを使うことで、簡単にスパム対策のreCAPTCHAを導入できるというお話でした。