アカウント管理(登録、ログイン、パスワードのリセット、ユーザー関連データの取得/設定)などのカスタムREST APIに依存するiOS/Androidアプリがあるとします。
私のAPIが私のモバイルアプリケーションからのみ呼び出されることを保証する良い方法はありません。クライアントコードに「シークレット」があるOauth2などは、簡単にリバースエンジニアリングできます。
次のようなAPI呼び出しがあるとします。
https://myapi.example.com/register_user?username=UUU&password=PPP&email=EEE
これにより、新しいユーザーが作成され、それ以降、すべてのAPI呼び出しに、セッショントークンまたはAPI呼び出しをアカウントを持つ特定のアプリユーザーに結び付けるものが含まれます。
この最初の登録呼び出しは、何も保護されていない唯一の呼び出しであり、私が心配しているのは、悪意のある人がPCスクリプトから1,000,000回呼び出して、特に実際の電子メールアドレスで多数の偽のユーザーを作成することです。そうすると、これらのアドレスを持つユーザーはアプリを使用できなくなります。
大量の誤用を防ぐために最初のAPI呼び出しをどのように保護できますか?ユーザー登録にサーバー検証済みのモバイルフレンドリーなCAPTCHAを含めることを考えています形。
繰り返しますが、後続のすべてのAPI呼び出しは、ユーザーごとに監視されるセッショントークンとAPI呼び出しカウントで保護されます(疑わしいものはブロックされます)。
それは、携帯電話のように本質的に安全でないクライアントから使用されても、それでも問題ないようにAPIを設計することです。基本的には、APIが完全に公開されたとしても、だれもそれで大したことはありません。したがって、ここでの質問はその最初のAPI呼び出しの保護に焦点を当てていますが、より一般的な問題を解決することについてもです。
他の興味深い代替手段としては、メールの検証や、Googleなどのサードパーティ製の確かなIDプロバイダーを使用することが挙げられます。これら3つのオプションはどれも完璧ではありません。とにかく、この問題に関する議論に興味があります。
それは理にかなっていますか?複雑すぎますか?
これに対する標準的なアプローチは、アカウントを確認するためにユーザーに電子メールを送信し、これが事前定義された期間内に発生しない場合は、登録を削除することです。
これをいくつかの異常検出と組み合わせることができます。たとえば、単一のIPアドレスから多数の登録を取得した場合、これは悪意があると見なして、そのIPアドレスをブロックできます。決定的な攻撃者に対して完璧ではありませんが、あまり決定的でない攻撃者を阻止できます。
CAPTCHAのようなものを登録プロセスに追加することもできます。これもまた、あまり決定的でない攻撃者を阻止できますが、比較的安価なCAPTCHA完了サービスなど、これらを回避する方法はいくつかあります。
これらのうちどれが妥当かは、アプリケーションのリスク/脅威プロファイルに大きく依存します。