スパム登録に悩まされている方のための対策、お伝えします。
実はわたしも、あるWebアプリを運用中にスパム登録に悩まされていました。メール認証を搭載していますが、本登録まで行わない登録が増えていたのです。
スパム登録を減らすため最初はマイルドな方法を実施しました。ですがそれでは効果が少なかったので、どんどん強めのブロックを行っていきました。
こんな経験を踏まえて、Laravelでのスパム登録のブロック方法ご紹介しますね。
スパム登録撲滅しましょう♪現在悩んでいる方の参考になれば幸いです。
まずは二段階認証を搭載
スパム登録のブロックの前にまずは二段階認証を搭載しておきましょう。
メールとパスワードだけで登録してしまえるサイトだと、簡単に不正なアクセス元にログインされてしまいます。なので二段階認証を搭載しておくことをおすすめします。
メール認証であれば、Laravelのもともとの機能を利用して比較的簡単に搭載できますよ。下記記事にてメール認証方法解説しています。
少し古いですが、基本の流れは同じです。
IPアドレスも取得しておきます
次にアクセスした人のIPアドレスを取得できるようにしておきます。Laravelの場合は、usersテーブルに、IPアドレスをいれるカラムを作っておきます。
さらに、ユーザー登録時のコントローラー側の処理で、次のように、IPアドレスを登録するためのコードをいれます。
【ユーザー登録用コード追加例】
1 2 3 4 5 6 |
$user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), 'ip_address' => $request->ip(), // IPアドレスを取得して保存するコード追加例 ]); |
また、規約等の該当箇所に、下記のような文書を追加しておきましょう。
【IPアドレス利用についての文言例】
IPアドレスの使用について: 当社は、サービスの改善とセキュリティの強化のため、お客様のIPアドレスを収集・利用します。この情報は法的要件に基づき、適切に管理されます。
このあたりの文書は、既存のWebアプリをお手本にさせてもらうと作りやすいですよ。
IPアドレスのあやしさ度チェック!
IPアドレスを取得したことで、不正アクセス元のデータが取れます。データが取得できたら、次のようなサイトで「あやしさ度チェック」が可能になります。
スパム登録を分析して、どのようにアクセスをとめるか対策を考えていきましょう。
AbuseIPDB
あやしげ、というか悪いIPアドレスを報告するサイト。ここで、ブラック度をチェックできます。
IPアドレス住所検索
IPアドレスをもとに住所を検索できるサイトです。
一定回数以上の登録をブロック
ここからスパム登録のブロック方法についてお伝えします。
まずはメール認証をせずに、同じメールアドレスやIPアドレスで何回も登録してくるユーザーがいる場合の対策をご紹介します。
こういったスパム登録をとめるには、まずはユーザーテーブルにattemptカラムを追加しておきます。この部分のコードは割愛します。
次にユーザー登録フォームにコードを追加し、ユーザー登録時に数字が入るようにします。さらに、ユーザー登録時には、attemptカラムの数字が一定以上であれば登録できないようにします。
参考コードはこちら。
【ユーザー登録用コード追加例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 新規登録ユーザーのIPアドレスを取得 $ip = $request->ip(); // 同じIPアドレスで作った最初のユーザーを検索 $user = User::where('ip', $ip)->orderBy('id', 'desc')->first(); // 既に4回以上の登録試みがある場合はエラーを返す if ($user && $user->attempts >= 4) { return response()->json(['error' => '登録の試みが多すぎます。サポートにご連絡ください。'], 429); } // 4回未満の場合、ユーザー登録処理へ。ユーザー登録処理ではattemptカラムに数字を増やす if (!$user) { $user = new User(); $user->ip = $ip; } $user->attempts++; $user->save(); |
この方法のデメリットは、「うっかり間違えて何度も登録しちゃった」ユーザーもブロックする可能性があることです。
なので、何回以上間違えたユーザーをブロックするか、数字の指定も大事です。
特定のIPアドレスをブロック
確実に「あやしい」IPアドレスをしぼれたら、IPアドレスごとにブロックするのが効果的。Laravelでルールを作ってしまうとやりやすいです。
まずは、下記コマンドで新たにルールを作成します。ルールの名前は、ここでは仮にLimitRegistrationAttemptsとしておきます。
【ルール作成コマンド】
1 |
php artisan make:rule LimitRegistrationAttempts |
作成したLimitRegistrationAttemptsルールには、次のようにコードをいれます。
【ルール記入例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?php namespace App\Rules; use Illuminate\Contracts\Validation\Rule; use App\Models\User; class LimitRegistrationAttempts implements Rule { public function passes($attribute, $value) { // 新規登録ユーザーのIPアドレスを取得 $ip = request()->ip(); // 特定のIPアドレスだった場合はブロック $blockedIps = ['IPアドレス', 'IPアドレス']; if (in_array($ip, $blockedIps)) { return false; } return true; } public function message() { return 'こちらのIPアドレスからの登録試みが多すぎます。別の方法で登録してください。'; } } |
このLimitRegistrationAttemptsルールをユーザー登録時のバリデーションに追加します。
【バリデーションにルール追加例】
1 2 3 4 5 6 7 8 9 10 11 |
use App\Rules\LimitRegistrationAttempts; public function register(Request $request) { $request->validate([ 'email' => ['required', 'email', new LimitRegistrationAttempts], // 他のバリデーションルール... ]); // ユーザー登録のロジック... } |
国ごとにブロック
スパム登録を行うIPアドレスを調べた結果、特定の国からのIPアドレスが多かった場合には、国ごとブロックが有効です。
torann/geoipなどのライブラリを使うと、IPアドレスに基づいて国を特定する処理を手軽に実装できます。
torann/geoipの使い方サイトはこちら
わたしの場合は、今回は、国ごとブロックが一番効果がありました。
ただ国ごとブロックを行うと、特定の市場からのユーザーを締め出すことになりかねません。グローバル展開のWebアプリの場合は、慎重に検討する必要があります。
おまけ:問題のあるメールアドレスを撃退
本記事をXに投稿したところ、「こんな方法もあるよ」と有益な情報をコメントで頂きました。こちらも追加でご紹介します。
Laravelでのスパム登録対策について、書きました。にっくきスパム登録は、しっかりと分析を行った後で、一番効果がある手段でしとめていきましょう🔥https://t.co/GYBSwvwqK6
— Junko@Laravel大好きエンジニア (@laravel_junko) October 11, 2024
Laravelでは、ライブラリを使っておかしなメールアドレスを簡単に撃退する方法もあります。下記ライブラリをインストールします。
1 |
composer require egulias/email-validator |
ユーザー登録に、 'email:rfc,dns,spoof' のようにバリデーションルールを追加します。
このルールを追加することで、下記のバリデーションルールを追加できます。
rfc
: メールアドレスがRFC標準に準拠しているかを検証します。dns
: メールアドレスのドメインが存在するかをDNSレコードをチェックして検証します。spoof
: メールアドレスがなりすましでないかを検証します。
具体的には、taro@testなどのメールアドレスは、dnsチェックによってはじいてくれます。
ただわたしの場合は、あまり効果がありませんでした。正しい形式のメールアドレスや存在するドメインを使って登録された場合は防御しきれません。
スパム登録されたメールアドレスが、上記のバリデーションルールで撃退できそうな場合は、お試しください。
さいごに
スパム登録についてお伝えしました。実際にブロックする方法を行う前に、まずは「スパム登録の分析」をしっかり行ってから対策を考えるのがポイントです。
なお今回は割愛しましたが、他にも、reCAPTCHAを使う、短時間での集中登録をブロックするといった方法もあります。
特にひとつに絞る必要はないので、あなたのWebアプリにあった対策を組み合わせて、スパム登録をがっつりとめていきましょう。